{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:43:48.083364Z",
     "iopub.status.busy": "2021-12-26T14:43:48.082655Z",
     "iopub.status.idle": "2021-12-26T14:44:28.627674Z",
     "shell.execute_reply": "2021-12-26T14:44:28.627120Z",
     "shell.execute_reply.started": "2021-12-26T14:26:38.215998Z"
    },
    "papermill": {
     "duration": 40.575438,
     "end_time": "2021-12-26T14:44:28.627798",
     "exception": false,
     "start_time": "2021-12-26T14:43:48.052360",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.6.0\r\n",
      "10.2\r\n",
      "\u001b[33mWARNING: You are using pip version 20.2.4; however, version 21.3.1 is available.\r\n",
      "You should consider upgrading via the '/opt/conda/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\r\n",
      "\u001b[33mWARNING: You are using pip version 20.2.4; however, version 21.3.1 is available.\r\n",
      "You should consider upgrading via the '/opt/conda/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\r\n"
     ]
    }
   ],
   "source": [
    "!python -c \"import torch; print(torch.__version__)\"\n",
    "!python -c \"import torch; print(torch.version.cuda)\"\n",
    "!pip -q install torch-spline-conv==latest+cu102 torch-scatter==latest+cu102 torch-cluster==latest+cu102 torch-sparse==latest+cu102  -f https://pytorch-geometric.com/whl/torch-1.6.0.html\n",
    "\n",
    "#!pip -q install torch-geometric==1.7.0    \n",
    "!pip install -q git+https://github.com/elmahyai/pytorch_geometric_temporal   # remove after merging\n",
    "#!pip -q install torch-geometric-temporal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:44:28.669393Z",
     "iopub.status.busy": "2021-12-26T14:44:28.668621Z",
     "iopub.status.idle": "2021-12-26T14:44:36.833339Z",
     "shell.execute_reply": "2021-12-26T14:44:36.832761Z",
     "shell.execute_reply.started": "2021-12-26T14:27:21.629074Z"
    },
    "papermill": {
     "duration": 8.187854,
     "end_time": "2021-12-26T14:44:36.833462",
     "exception": false,
     "start_time": "2021-12-26T14:44:28.645608",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import networkx as nx\n",
    "\n",
    "import torch\n",
    "import torch.nn.functional as F\n",
    "from torch_geometric.nn import GCNConv\n",
    "from torch_geometric_temporal.nn.recurrent import A3TGCN2\n",
    "from torch_geometric_temporal.signal import temporal_signal_split\n",
    "\n",
    "# GPU support\n",
    "DEVICE = torch.device('cuda') # cuda\n",
    "shuffle=True\n",
    "batch_size = 32"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.016367,
     "end_time": "2021-12-26T14:44:36.867084",
     "exception": false,
     "start_time": "2021-12-26T14:44:36.850717",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "<h1>\n",
    "<center>A3T-GCN: Attention Temporal Graph\n",
    "Convolutional Network for Traffic Forecasting</center>\n",
    "</h1>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.028442,
     "end_time": "2021-12-26T14:44:36.914189",
     "exception": false,
     "start_time": "2021-12-26T14:44:36.885747",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Dataset\n",
    "- Traffic forecasting dataset based on Los Angeles Metropolitan traffic \n",
    "- 207 loop detectors on highways\n",
    "- March 2012 - June 2012\n",
    "- From the paper: Diffusion Convolutional Recurrent Neural Network\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:44:36.984196Z",
     "iopub.status.busy": "2021-12-26T14:44:36.983350Z",
     "iopub.status.idle": "2021-12-26T14:44:42.177982Z",
     "shell.execute_reply": "2021-12-26T14:44:42.177369Z",
     "shell.execute_reply.started": "2021-12-26T14:27:29.422377Z"
    },
    "papermill": {
     "duration": 5.23249,
     "end_time": "2021-12-26T14:44:42.178137",
     "exception": false,
     "start_time": "2021-12-26T14:44:36.945647",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset type:   <torch_geometric_temporal.signal.static_graph_temporal_signal.StaticGraphTemporalSignal object at 0x7f1ad052de10>\n",
      "Number of samples / sequences:  34249\n",
      "Data(edge_attr=[1722], edge_index=[2, 1722], x=[207, 2, 12], y=[207, 12])\n"
     ]
    }
   ],
   "source": [
    "from torch_geometric_temporal.dataset import METRLADatasetLoader\n",
    "loader = METRLADatasetLoader()\n",
    "dataset = loader.get_dataset(num_timesteps_in=12, num_timesteps_out=12)\n",
    "print(\"Dataset type:  \", dataset)\n",
    "print(\"Number of samples / sequences: \",  len(set(dataset)))\n",
    "print(next(iter(dataset))) # Show first sample"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.017871,
     "end_time": "2021-12-26T14:44:42.214487",
     "exception": false,
     "start_time": "2021-12-26T14:44:42.196616",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "#### Data Sample\n",
    "- 207 nodes\n",
    "- 2 features per node (speed, time)\n",
    "- 12 timesteps per bucket (12 x 5 min = 60 min) \n",
    "- Labels for 12 future timesteps (normalized speed) --> node regression\n",
    "- Edge_attr is build based on the distances between sensors + threshold\n",
    "- Further details: https://pytorch-geometric-temporal.readthedocs.io/en/latest/_modules/torch_geometric_temporal/dataset/metr_la.html#METRLADatasetLoader\n",
    "- Raw data: https://graphmining.ai/temporal_datasets/METR-LA.zip"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:44:42.370207Z",
     "iopub.status.busy": "2021-12-26T14:44:42.312179Z",
     "iopub.status.idle": "2021-12-26T14:44:43.852514Z",
     "shell.execute_reply": "2021-12-26T14:44:43.853020Z",
     "shell.execute_reply.started": "2021-12-26T14:27:33.878048Z"
    },
    "papermill": {
     "duration": 1.621518,
     "end_time": "2021-12-26T14:44:43.853164",
     "exception": false,
     "start_time": "2021-12-26T14:44:42.231646",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f1ace710d10>]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Visualize traffic over time\n",
    "sensor_number = 1\n",
    "hours = 24\n",
    "sensor_labels = [bucket.y[sensor_number][0].item() for bucket in list(dataset)[:hours]]\n",
    "plt.plot(sensor_labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.033697,
     "end_time": "2021-12-26T14:44:43.929710",
     "exception": false,
     "start_time": "2021-12-26T14:44:43.896013",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# Test Train Split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:44:43.982843Z",
     "iopub.status.busy": "2021-12-26T14:44:43.978087Z",
     "iopub.status.idle": "2021-12-26T14:44:45.285472Z",
     "shell.execute_reply": "2021-12-26T14:44:45.286043Z",
     "shell.execute_reply.started": "2021-12-26T14:27:35.470260Z"
    },
    "papermill": {
     "duration": 1.33781,
     "end_time": "2021-12-26T14:44:45.286218",
     "exception": false,
     "start_time": "2021-12-26T14:44:43.948408",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of train buckets:  27399\n",
      "Number of test buckets:  6850\n"
     ]
    }
   ],
   "source": [
    "train_dataset, test_dataset = temporal_signal_split(dataset, train_ratio=0.8)\n",
    "\n",
    "print(\"Number of train buckets: \", len(set(train_dataset)))\n",
    "print(\"Number of test buckets: \", len(set(test_dataset)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.019118,
     "end_time": "2021-12-26T14:44:45.325730",
     "exception": false,
     "start_time": "2021-12-26T14:44:45.306612",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# Creating DataLoaders\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:44:45.374077Z",
     "iopub.status.busy": "2021-12-26T14:44:45.373097Z",
     "iopub.status.idle": "2021-12-26T14:45:16.840268Z",
     "shell.execute_reply": "2021-12-26T14:45:16.839682Z",
     "shell.execute_reply.started": "2021-12-26T14:27:36.727755Z"
    },
    "papermill": {
     "duration": 31.495574,
     "end_time": "2021-12-26T14:45:16.840390",
     "exception": false,
     "start_time": "2021-12-26T14:44:45.344816",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "train_input = np.array(train_dataset.features) # (27399, 207, 2, 12)\n",
    "train_target = np.array(train_dataset.targets) # (27399, 207, 12)\n",
    "train_x_tensor = torch.from_numpy(train_input).type(torch.FloatTensor).to(DEVICE)  # (B, N, F, T)\n",
    "train_target_tensor = torch.from_numpy(train_target).type(torch.FloatTensor).to(DEVICE)  # (B, N, T)\n",
    "train_dataset_new = torch.utils.data.TensorDataset(train_x_tensor, train_target_tensor)\n",
    "train_loader = torch.utils.data.DataLoader(train_dataset_new, batch_size=batch_size, shuffle=shuffle,drop_last=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:45:16.886780Z",
     "iopub.status.busy": "2021-12-26T14:45:16.885865Z",
     "iopub.status.idle": "2021-12-26T14:45:17.010178Z",
     "shell.execute_reply": "2021-12-26T14:45:17.009681Z",
     "shell.execute_reply.started": "2021-12-26T14:28:07.974097Z"
    },
    "papermill": {
     "duration": 0.150197,
     "end_time": "2021-12-26T14:45:17.010312",
     "exception": false,
     "start_time": "2021-12-26T14:45:16.860115",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "test_input = np.array(test_dataset.features) # (, 207, 2, 12)\n",
    "test_target = np.array(test_dataset.targets) # (, 207, 12)\n",
    "test_x_tensor = torch.from_numpy(test_input).type(torch.FloatTensor).to(DEVICE)  # (B, N, F, T)\n",
    "test_target_tensor = torch.from_numpy(test_target).type(torch.FloatTensor).to(DEVICE)  # (B, N, T)\n",
    "test_dataset_new = torch.utils.data.TensorDataset(test_x_tensor, test_target_tensor)\n",
    "test_loader = torch.utils.data.DataLoader(test_dataset_new, batch_size=batch_size, shuffle=shuffle,drop_last=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.018593,
     "end_time": "2021-12-26T14:45:17.047998",
     "exception": false,
     "start_time": "2021-12-26T14:45:17.029405",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Model\n",
    "\n",
    "Which model to choose depends on which time-series task you work on. \n",
    "\n",
    "- A3TGCN is an extension of TGCN that uses attention \n",
    "- The spatial aggregation uses GCN, the temporal aggregation a GRU\n",
    "- We can pass in periods to get an embedding for several timesteps\n",
    "- This embedding can be used to predict several steps into the future = output dimension\n",
    "- We could also do this in a loop and feed it again into the model (would be autoregressive)\n",
    "- There is only one block here. Other layers also allow stacking???\n",
    "\n",
    "<html>\n",
    "<img src=\"https://i.ibb.co/WxrJQbc/a3tgcn.png\", height=\"300\"></img>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.018337,
     "end_time": "2021-12-26T14:45:17.085185",
     "exception": false,
     "start_time": "2021-12-26T14:45:17.066848",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# TGCN model\n",
    "A temporal GCN (T-GCN) model was constructed by combining GCN and GRU. \n",
    "\n",
    "n historical time series traffic data were inputted into the T-GCN model to obtain n hidden states (h) that covered spatiotemporal characteristics:{h(t−n), · · · , h(t−1), h(t)}\n",
    "\n",
    "\n",
    "ut = σ(Wu ∗ (GC(A, Xt), ht−1)) \n",
    "\n",
    "rt = σ(Wr ∗ (GC(A, Xt), ht−1)) \n",
    "\n",
    "ct = tanh(Wc ∗ (GC(A, Xt), (rt ∗ ht−1)))\n",
    "\n",
    "ht = ut ∗ ht−1 + (1 − ut) ∗ ct) \n",
    "\n",
    "\n",
    "Then, the hidden states were inputted into the attention model to determine the context vector that covers the global traffic variation information. Particularly, the weight of each h was calculated by Softmax using a multilayer perception:{at−n, · · · , at−1, at}.The context vector that covers global traffic variation information is calculated by the weighted sum. \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.018547,
     "end_time": "2021-12-26T14:45:17.122157",
     "exception": false,
     "start_time": "2021-12-26T14:45:17.103610",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# A3TGCN Model\n",
    "The A3TGCN is an extention of the TGCN model by adding an attention mechanism.\n",
    "\n",
    "The attention mechanism was introduced to re-weight the influence of historical traffic states and thus to capture the global variation trends of traffic state"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:45:17.167230Z",
     "iopub.status.busy": "2021-12-26T14:45:17.166722Z",
     "iopub.status.idle": "2021-12-26T14:45:17.181682Z",
     "shell.execute_reply": "2021-12-26T14:45:17.181219Z",
     "shell.execute_reply.started": "2021-12-26T14:28:08.105670Z"
    },
    "papermill": {
     "duration": 0.041032,
     "end_time": "2021-12-26T14:45:17.181766",
     "exception": false,
     "start_time": "2021-12-26T14:45:17.140734",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "TemporalGNN(\n",
       "  (tgnn): A3TGCN2(\n",
       "    (_base_tgcn): TGCN2(\n",
       "      (conv_z): GCNConv(2, 32)\n",
       "      (linear_z): Linear(in_features=64, out_features=32, bias=True)\n",
       "      (conv_r): GCNConv(2, 32)\n",
       "      (linear_r): Linear(in_features=64, out_features=32, bias=True)\n",
       "      (conv_h): GCNConv(2, 32)\n",
       "      (linear_h): Linear(in_features=64, out_features=32, bias=True)\n",
       "    )\n",
       "  )\n",
       "  (linear): Linear(in_features=32, out_features=12, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class TemporalGNN(torch.nn.Module):\n",
    "    def __init__(self, node_features, periods, batch_size):\n",
    "        super(TemporalGNN, self).__init__()\n",
    "        # Attention Temporal Graph Convolutional Cell\n",
    "        self.tgnn = A3TGCN2(in_channels=node_features,  out_channels=32, periods=periods,batch_size=batch_size) # node_features=2, periods=12\n",
    "        # Equals single-shot prediction\n",
    "        self.linear = torch.nn.Linear(32, periods)\n",
    "\n",
    "    def forward(self, x, edge_index):\n",
    "        \"\"\"\n",
    "        x = Node features for T time steps\n",
    "        edge_index = Graph edge indices\n",
    "        \"\"\"\n",
    "        h = self.tgnn(x, edge_index) # x [b, 207, 2, 12]  returns h [b, 207, 12]\n",
    "        h = F.relu(h) \n",
    "        h = self.linear(h)\n",
    "        return h\n",
    "\n",
    "TemporalGNN(node_features=2, periods=12, batch_size=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.01927,
     "end_time": "2021-12-26T14:45:17.220204",
     "exception": false,
     "start_time": "2021-12-26T14:45:17.200934",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:45:17.274663Z",
     "iopub.status.busy": "2021-12-26T14:45:17.273722Z",
     "iopub.status.idle": "2021-12-26T14:45:17.301756Z",
     "shell.execute_reply": "2021-12-26T14:45:17.300951Z",
     "shell.execute_reply.started": "2021-12-25T23:05:32.708582Z"
    },
    "papermill": {
     "duration": 0.059799,
     "end_time": "2021-12-26T14:45:17.301931",
     "exception": false,
     "start_time": "2021-12-26T14:45:17.242132",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Net's state_dict:\n",
      "tgnn._attention \t torch.Size([12])\n",
      "tgnn._base_tgcn.conv_z.weight \t torch.Size([2, 32])\n",
      "tgnn._base_tgcn.conv_z.bias \t torch.Size([32])\n",
      "tgnn._base_tgcn.linear_z.weight \t torch.Size([32, 64])\n",
      "tgnn._base_tgcn.linear_z.bias \t torch.Size([32])\n",
      "tgnn._base_tgcn.conv_r.weight \t torch.Size([2, 32])\n",
      "tgnn._base_tgcn.conv_r.bias \t torch.Size([32])\n",
      "tgnn._base_tgcn.linear_r.weight \t torch.Size([32, 64])\n",
      "tgnn._base_tgcn.linear_r.bias \t torch.Size([32])\n",
      "tgnn._base_tgcn.conv_h.weight \t torch.Size([2, 32])\n",
      "tgnn._base_tgcn.conv_h.bias \t torch.Size([32])\n",
      "tgnn._base_tgcn.linear_h.weight \t torch.Size([32, 64])\n",
      "tgnn._base_tgcn.linear_h.bias \t torch.Size([32])\n",
      "linear.weight \t torch.Size([12, 32])\n",
      "linear.bias \t torch.Size([12])\n",
      "Net's total params: 6936\n",
      "Optimizer's state_dict:\n",
      "state \t {}\n",
      "param_groups \t [{'lr': 0.001, 'betas': (0.9, 0.999), 'eps': 1e-08, 'weight_decay': 0, 'amsgrad': False, 'params': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]}]\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# Create model and optimizers\n",
    "model = TemporalGNN(node_features=2, periods=12, batch_size=batch_size).to(DEVICE)\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n",
    "loss_fn = torch.nn.MSELoss()\n",
    "\n",
    "\n",
    "print('Net\\'s state_dict:')\n",
    "total_param = 0\n",
    "for param_tensor in model.state_dict():\n",
    "    print(param_tensor, '\\t', model.state_dict()[param_tensor].size())\n",
    "    total_param += np.prod(model.state_dict()[param_tensor].size())\n",
    "print('Net\\'s total params:', total_param)\n",
    "#--------------------------------------------------\n",
    "print('Optimizer\\'s state_dict:')\n",
    "for var_name in optimizer.state_dict():\n",
    "    print(var_name, '\\t', optimizer.state_dict()[var_name])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.020038,
     "end_time": "2021-12-26T14:45:17.343900",
     "exception": false,
     "start_time": "2021-12-26T14:45:17.323862",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# Loading the graph once \n",
    "because it's a static graph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:45:17.387739Z",
     "iopub.status.busy": "2021-12-26T14:45:17.387103Z",
     "iopub.status.idle": "2021-12-26T14:45:17.390422Z",
     "shell.execute_reply": "2021-12-26T14:45:17.389947Z",
     "shell.execute_reply.started": "2021-12-25T23:05:32.742421Z"
    },
    "papermill": {
     "duration": 0.026807,
     "end_time": "2021-12-26T14:45:17.390513",
     "exception": false,
     "start_time": "2021-12-26T14:45:17.363706",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "for snapshot in train_dataset:\n",
    "    static_edge_index = snapshot.edge_index.to(DEVICE)\n",
    "    break;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:45:17.437982Z",
     "iopub.status.busy": "2021-12-26T14:45:17.437484Z",
     "iopub.status.idle": "2021-12-26T14:46:13.161937Z",
     "shell.execute_reply": "2021-12-26T14:46:13.161017Z",
     "shell.execute_reply.started": "2021-12-25T23:05:32.751777Z"
    },
    "papermill": {
     "duration": 55.751589,
     "end_time": "2021-12-26T14:46:13.162096",
     "exception": false,
     "start_time": "2021-12-26T14:45:17.410507",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.797569936811924\n",
      "0.6679292801022529\n",
      "0.6100249779224396\n",
      "0.5751089830696583\n",
      "0.5526966672539712\n",
      "0.5415776373445987\n",
      "0.5327171741213117\n",
      "0.5293058890849351\n",
      "Epoch 0 train RMSE: 0.5256\n"
     ]
    }
   ],
   "source": [
    "model.train()\n",
    "\n",
    "for epoch in range(1):\n",
    "    step = 0\n",
    "    loss_list = []\n",
    "    for encoder_inputs, labels in train_loader:\n",
    "        y_hat = model(encoder_inputs, static_edge_index)         # Get model predictions\n",
    "        loss = loss_fn(y_hat, labels) # Mean squared error #loss = torch.mean((y_hat-labels)**2)  sqrt to change it to rmse\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        optimizer.zero_grad()\n",
    "        step= step+ 1\n",
    "        loss_list.append(loss.item())\n",
    "        if step % 100 == 0 :\n",
    "            print(sum(loss_list)/len(loss_list))\n",
    "    print(\"Epoch {} train RMSE: {:.4f}\".format(epoch, sum(loss_list)/len(loss_list)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "papermill": {
     "duration": 0.021991,
     "end_time": "2021-12-26T14:46:13.206348",
     "exception": false,
     "start_time": "2021-12-26T14:46:13.184357",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.022713,
     "end_time": "2021-12-26T14:46:13.250898",
     "exception": false,
     "start_time": "2021-12-26T14:46:13.228185",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Evaluation\n",
    "\n",
    "- Lets get some sample predictions for a specific horizon (e.g. 288/12 = 24 hours)\n",
    "- The model always gets one hour and needs to predict the next hour"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:46:13.301157Z",
     "iopub.status.busy": "2021-12-26T14:46:13.300285Z",
     "iopub.status.idle": "2021-12-26T14:46:23.410533Z",
     "shell.execute_reply": "2021-12-26T14:46:23.411181Z",
     "shell.execute_reply.started": "2021-12-25T22:37:06.708018Z"
    },
    "papermill": {
     "duration": 10.1385,
     "end_time": "2021-12-26T14:46:23.411366",
     "exception": false,
     "start_time": "2021-12-26T14:46:13.272866",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test MSE: 0.6038\n"
     ]
    }
   ],
   "source": [
    "model.eval()\n",
    "step = 0\n",
    "# Store for analysis\n",
    "total_loss = []\n",
    "for encoder_inputs, labels in test_loader:\n",
    "    # Get model predictions\n",
    "    y_hat = model(encoder_inputs, static_edge_index)\n",
    "    # Mean squared error\n",
    "    loss = loss_fn(y_hat, labels)\n",
    "    total_loss.append(loss.item())\n",
    "    # Store for analysis below\n",
    "    #test_labels.append(labels)\n",
    "    #predictions.append(y_hat)\n",
    "    \n",
    "\n",
    "print(\"Test MSE: {:.4f}\".format(sum(total_loss)/len(total_loss)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.021809,
     "end_time": "2021-12-26T14:46:23.456452",
     "exception": false,
     "start_time": "2021-12-26T14:46:23.434643",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "### Visualization\n",
    "\n",
    "- The further away the point in time is, the worse the predictions get\n",
    "- Predictions shape: [num_data_points, num_sensors, num_timesteps]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:46:23.506391Z",
     "iopub.status.busy": "2021-12-26T14:46:23.505530Z",
     "iopub.status.idle": "2021-12-26T14:46:23.511700Z",
     "shell.execute_reply": "2021-12-26T14:46:23.512123Z",
     "shell.execute_reply.started": "2021-12-25T19:05:28.569378Z"
    },
    "papermill": {
     "duration": 0.0341,
     "end_time": "2021-12-26T14:46:23.512227",
     "exception": false,
     "start_time": "2021-12-26T14:46:23.478127",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data points:, (32,)\n"
     ]
    }
   ],
   "source": [
    "sensor = 123\n",
    "timestep = 11 \n",
    "preds = np.asarray([pred[sensor][timestep].detach().cpu().numpy() for pred in y_hat])\n",
    "labs  = np.asarray([label[sensor][timestep].cpu().numpy() for label in labels])\n",
    "print(\"Data points:,\", preds.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2021-12-26T14:46:23.572365Z",
     "iopub.status.busy": "2021-12-26T14:46:23.571817Z",
     "iopub.status.idle": "2021-12-26T14:46:23.787013Z",
     "shell.execute_reply": "2021-12-26T14:46:23.786488Z",
     "shell.execute_reply.started": "2021-12-25T19:05:29.188303Z"
    },
    "papermill": {
     "duration": 0.251559,
     "end_time": "2021-12-26T14:46:23.787119",
     "exception": false,
     "start_time": "2021-12-26T14:46:23.535560",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f1acfc59f90>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABIkAAAEvCAYAAADBz5EMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOydd3hUVfrHP5Pee4X0UELvJXQUpIqC0hFEAbHr2nd/u5a17eq6a0UFBQXpNpooSO+EHpIA6Qmk9zbJlPv740wavSSZmeR8nuc+d+bmztxzMzP3nvM97/t9VYqiIJFIJBKJRCKRSCQSiUQiadlYGLsBEolEIpFIJBKJRCKRSCQS4yNFIolEIpFIJBKJRCKRSCQSiRSJJBKJRCKRSCQSiUQikUgkUiSSSCQSiUQikUgkEolEIpEgRSKJRCKRSCQSiUQikUgkEglSJJJIJBKJRCKRSCQSiUQikQBWxm7A9fDy8lJCQkKM3QyJRCKRSCQSiUQikUgkkmbDsWPHchVF8b58u0mLRCEhIURFRRm7GRKJRCKRSCQSiUQikUgkzQaVSpVyte0y3UwikUgkEolEIpFIJBKJRCJFIolEIpFIJBKJRCKRSCQSiRSJJBKJRCKRSCQSiUQikUgkmLgn0dXQaDSkp6ejVquN3ZRGw87OjoCAAKytrY3dFIlEIpFIJBKJRCKRSCQtBLMTidLT03F2diYkJASVSmXs5jQ4iqKQl5dHeno6oaGhxm6ORCKRSCQSiUQikUgkkhaC2aWbqdVqPD09m6VABKBSqfD09GzWkVISiUQikUgkEolEIpFITA+zE4mAZisQVdPcz08ikUgkEolEIpFIJBKJ6WGWIlFzYdeuXYwfP97YzZBIJBKJRCKRSCQSiUQikSJRY6DT6YzdBIlEIpFIJBKJRCKRSCSSW0KKRLdIcnIyERERzJkzh65du/Lggw9SXl5OSEgIb731FoMGDWLdunX88ccfREZG0rNnTyZPnkxpaSkAW7duJSIigkGDBvHTTz8Z+WwkEolEIpFITAB1ESTvh1OrxbokCxTF2K2SSCQSiaTFYXbVzUyBc+fO8c033zBw4EAeeeQRvvjiC0CUrt+3bx+5ublMmjSJ7du34+joyL/+9S8++ugjXn75ZebPn8+OHTto06YNU6dONfKZSCQSiRHRVICVHbRUHzZtJeSeB2sH8Aw3dmskkqZBUaD4EmSegczTYsk4DYUpV+5r6yJ+G55t6izh4BEOdi5N33aJRCKRSFoAZi0SvbnxLDGXihv0PTu2cuH1eztdd5/AwEAGDhwIwKxZs/jkk08AakSfQ4cOERMTU7NPVVUVkZGRxMXFERoaStu2bWte+/XXXzdo+yUSyXVQFEjcBee2gFc7aN0TfDuDla2xW9a80euhIMkwKDwDWdFiXXwR7D3AtxP4dATfjuDTCXwiwNbZ2K1uOBQFSrPEeWedhUzDOvcc6LViH98u0Ol+6DRRCkaS5oNOC3nxht/+qdprQHle7T4e4eJa3GsO+HUFt2AoSoO8BPHavHhIOwxn1gN1IoucfGtFo7oiknuIvKZLGoaLx0BbBcGRxm6JRCKRNClmLRIZi8urj1U/d3R0BEBRFEaOHMmqVavq7Xfy5ElZuawpUBTQqqGyxLAUi7WmAmwcxcyknauYhbR1AQtLY7dY0hSkHIAd70DKPrCwBr1GbLewBr/O0LoXtOop1l5t5ffidqkqh+xYER1QLQZlnYUqkXKLylIIdMEDxf+5KB2yY+DkD7X7gBgoVotHPh3EY882YGltnPO6WbSVkHOujiBkOP/y3Np9XFqL82k3SqzLcuDsz7Djn2Lx6yrEok73g0eY8c6lJaAoQrAoSBafg7GxcQQnP3DyEfcpc+ozVJVBVkxtdFDmGfFcWyH+bmkjfs/tx4J/N/DrIr7/VxOEvdtBm7vrb9OohdhcLRzlxQsh6dxv9T87lQW4BV0ZfeTZBlwCwEI6LUhugqyzsOxe0VeYswmC+hm7RS0HdXHt77v6t25pDYNfBK82xm6dxFjkJ8HJlVCYaugXdhb3EGc/87pXmgkqxYTzvXv37q1ERUXV2xYbG0uHDh2M1CLhSRQaGsqBAweIjIxk/vz5RERE8OmnnxIVFYWXlxc5OTn06tWrJq2svLyc9PR0goKCaNeuHTt37iQ8PJzp06dTUlLCpk2brjiOsc/TKOh1dYQdw1JVcuW26y3V+1fPzt8MNs5CMLJzNQhI13rsetljg8hk4ygvTqZMehTseBsSd4qZ58Evihnr0mwxS3jpOFw8DpdOiu8PgI0TtOohltYG4cg1UH7Ol1OSVZsyUi0I5cWDohd/t3URN3G/LkKI8+sC3h3A2u7K99LroShVDCqzzxrWMZB7ARRDMQBLGyEw1Y068u0oRJem/myqo4Myow2CUHV00Pna64+VXa3A5WsYEPt2AgePq79nUTrE/CoEo/SjYpt/91rByD2kSU6t2aGpEJ3KghQhBtVdClPqi5OmhKWtuGY5+Yi1s2/95051njd15ExZLmScqpMydtlv385ViJ1+XcG/q/jte7VrPJG3ohDyE+oPKqsHmXU/Xys7IbzWRB+1rRWSHDzkNV4iKM+HxcOFMGltL/qVC3YK8VHSMGgrxTX48t9r7gUoy66zo0r838vzxARw3wUw9GWwdzdWyyVNSVU5xG6EE8sheS+gEve90szafaoj0v3q9LO8I8RvV3JDVCrVMUVRel+xXYpEt0ZycjJjx45lyJAhHDhwgLZt27J8+XI6duxYIxIB7Nixg1deeYXKykoA3n77bSZMmMDWrVt57rnn8PLyYtCgQURHR7cMkej496ITeXl0T81SCpqym3sva0cx82jrDLZOhrVLnW3OYpB/+XZrezHTqS4Sx1cXidmKmseXba9+fiPBSWVZKxhVC0nXEpzs3cHZXyxOPqYfFWHOZJyCne/C+a3g4AmDnofej4KNw9X31+sh74IQji4eF+usaNBVib87eAmxqHVPQ8RRT3D0arrzMSZ1U0ayztSmjNSdvXcNMohBdQQht+A7H3RV+/ZcLh4VX6zdx87VEHFUN2WtA9i73dmx67YhJ65OqphhqZsy4xJg6KR0rhWFPMLA8jYDdgtTawWji8fEtlY9awUjOVipRa8Xgt3l4k/145KM+vtbO4jvpntI/cXJW0ShGAtFEYJGabY4n5LM2sel2aJTXPc7Vxc7t1rByNnvMjGpeu0n7kG3Ekmj10NhsvAMqisI1f2fugYaBKEutYKQqYjq1WJuXrwYfNaNTihIqn9/t3OrFYxadYdOk4QwJ2lZ6LTwwwMi+vjhLeL+smQEuAbAo783r1Toxkavh+L0K6OC8uLFPa5aVAZw9Ll2+qi1nbgG7nxHjCfsXGHYa9D7EdmPbo4oipjAPbFCpBlXFovvQY9Z0G26+C2W54u+YNbZ2km6upGrKgvx/akWjaqjjkzl3mRCSJGogUhOTmb8+PFER0c36nGMfZ4NSmUpvNdaiDsOnvXFnBsuLnUEH4P4c7uDrttBUcQsdI2AVC0eXSYkXSE41XlceS3fLBU4eosOvbO/WLu0qv/c2V+IEzI8/ubJjhXiUOwG0ekf+Az0fUwIireKtlLceC4eg0snxDrnHDW+GG5BddLUeoqoj9s5jimhLq696VYPCLNjxQweiGge7wjDoLBz7cxNU8/qVRSIdmWdNXQUYsTzyqLafVwCDKJRh9qoI6921466UBQxMM86K8SwalEo93xtNFNNdFBnQ5RUZyFOXSs6qCEoSK4VjC6dENta964VjFwDGu/YpkJlSW0kUOHlEUEpoKuss7NKRJe5h4D7VcQgR2/z7STqNEKcrRGOskREX2lW/W2lWaApv/L1FlZiMHZFdJJBTLL3EP/TGkEoujbCUmUJ3u1rBaHqpTG/+42JTiu+S1dEH8ULEVplAeF3iUFJ+7HXnmCQNC9+/xsc/AwmfAo9Z4ttCTtgxYPQdiRMWynT0etSnbJ7+W8oLwHyE2v7DiD68FcY0RuEITvXmzteZjT8/ldI2i3u5/e8Iz4Xc72mS2opy4XTa4Q4lB0DVvbQ8T4hDgUPvPFYSK8T96+s6Frvx6zo+kURbF3rCEcG8cing/n33e8AKRI1EFIkug0yo+HLgfDgt9D5AWO3punR60UnW10kbqQlWWIWtiSzzvqSWF/NE8PCytCZ979SQKpeu/gLQaQl3yRz42H3+2LWwcYJIp+EyCduvuNxs1SWiCilmoij4yJNCsSgwqu9IUXNEHHk2xmsbBq2DQ2Booj0puo0seoBYUFS7T72HvUHg42dMnKnKIoY3F0edZRzro4HlZXolFZHHTn6GKKEDB2KupEaroH1Z6B8O4vOrDEHCPlJEPOLEIwyToltAX1rBSOXVsZr252g14nP7vJ0sGphqK6nE4gJhMsFILfqdaA0Lr48KqmemFRnW2mWuO/UndEHMalTLQJXi0I+Ha+eKtocyTkHp1bD6bUiEsLGGTrdB12n3dxgRWKenFoDPy+APvNh3If1/3ZkMWx5EQY8A/f80zjtMyZVZVcXVPPiRf+2Ggtr8Ai9elSQk2/D9FMVRUSJ//F/4vjhd8God8VgX2Je6HVChD3+vfCX02tE37nnQ2LM2BB9eHWxYVKxWjgyLNUTIADuofX7e36dRZ+iBVzrpUhkZjSr84zdBGtmwvwdIupCcm10mto0g7pCUnFG/efqwitfa2V3DRHpsuik5qaWFyTD7g/g1CoxMOz3mOjENeXsdmlObaTRJUOqWrXYYGkjBlh1I4482179xlNtuq6pqF1f8bhC+CRUrzXl13/NNV9bUZtKh0qkRtWkihkGhc7+zUN41GlER7Je1NFZEe4OYrbKp4MhVax66Wj6ngd5CbWCUeYZsS0oUghGHSYI8diU0Otqq1blJ9au8xOEGFQt5IGIWnELvHpamHuI+Gyaw3fTFNDrxPWqNEvM5LoGikGejJYQkzwp+4RgFPOrEN5cA6HrVOg2TZjvS5oHl07At6NFlObsX64+GbLpLxD1Ddz3BfSY2fRtNAZJe+HXJ+tHY4D4HVwRFRQuUs+bKuJfWwVHl4gJwsoS6PUwDP9by7ECMGfyE0XE0MlVYqLcwVOI8D1mCpGmsVEU0QesSVczCEh5CdRkC1g7ir5gXfHIp2PDWRmYCFIkMjOa1Xke+FSo/S8nmW9YuqmhqTAIRnWikGpEpDrC0tV8ntxDIWKcWAL7me9AoOgi7PlAmNmpLKHPPBj0nEiZMDbVN59qwejiCdEBrf48bF1EipBWXV+0qRuWfatY2YnF2l4sVvZi1t/K8LzmcZ21W5AQhHw6Nj/x8GZQF4vBsVuQ+f4OqsmNh5if4ewvorODCoIH1ApGTeWtUuNBkSDEn/yk2scFyXWESYQ3kEdYnSW0VgRyCWja1GKJ5EZUlUHcFjEhkbhTRF+17iXS0To/0Hz6N3o95MSKQVz43S0jza40G74eJqKBF+y6tsig08AKg1/RnI0QHNmEjTQCKQfF+bq0EqKoZxshjLqHmtb3ojwfdr0vBCMbRxjykpgwbOkRpaZGVbkQ20+sEOK7ygLajBDpZO3GmEbUfVW5uP7VjTjKPFN/ct41UBTAGfKS8drZgEiRyMxoVue5+QU4sw5eTTV2S1oe6uL6AlLxRdG5SdotBmsOnuLCHDEWwoab1k3/WpRkwb6PIGqp6KT3mgODXzD9NBu9TnjbVJtil2ReKd5YO9QKPdcVfOzr72dl1yJCYiU3Sc45IRad/Vl0dlBByCCRjtZhwp0LqXq9uKZUV5PKT4C8xFpRqK4/UHU1qeqKUh7htWtZtlZirpRkin7NyVUiKtHCGtqNEhFG7UaZ1+BUpxGpqykHxJJ6sHZAFDIYZqw1j77B7aKtgu8niAqnj2wVpuXXo6JAGFlXFIgI+eZadTI9Cr6/X0wwPLzFPEzcc86LSekLvwsh655/QsR4eZ8xJooi+rwnlsOZH0WKl3uoEIa6zzD9vjsY/CozagWjrLMQ1B/6zjd2yxoEKRKZGc3qPJdPEn4Sj+0xdksk1aiLIeFPiNsM5/8QZr9W9iKvO2IctBsNjp7GbmV9yvJg//+EL4CuSoSkDnlJVnmSSK5HdqxBMPpJiJQqC4NgZIgwutaMebWJdz0hqDo9LKm2ggiIUu0eoQYBKOwyIchfCpiS5k3mGZGOdmadSNmzcxORRd2mQUAf0xugVpXDxSgRJZKyH9KP1pqce4SL6JjggSJyastLEDYMpq9uvn5U1SlkD3wDXR68udfkxsOSu0Q6/6N/iOq1zYlLJ+C7+0R03Nwt5jGQr0v8n8KAPCcWggfB6HfBv5uxW9WyKMsV18UTK8TnYGUvJqp6PCSinE3tutiCkSKRmdGszvOTHiKlZcp3xm6J5Gpoq0RHMW4znNtSW9UlKFJUdIkYJwaAxqKiUFQaObRIdGS7TIGhL4tBqEQiuTkUxSAY/SwEo7x4kaYZOlhUD7GwvkwISqxfHcvSRsyY1whAdSKDXFpLIUgi0WkhcZdIR4vbJNKHPcJEOlrXKcaLOKkohLTDtZFCl04Y/L9UwmcjeIAQhoIGXBktcuIH+PUJaDMSpv1gXhFSN8OxZbDx2dszo07YKVKx2twtRDRzT1muJvMMfHevMGufu0V4w5kjOi0c/w52viPS0brPhLv/LiJYJY2DTismoE8sN5hQa4XHV49ZBhPqZiamNhOkSNRAFBYWsnLlSp544olGPY6xz7PB0OvgbR+IfApGvmns1khuhKJAxknhuxC3WYTRgygfHmEQjPy7N80MQGUJHPpSeFpVFonIh2GviRLMEonk9lEUES5dLRjlJ4rtFlbXFoJcA5rPIEgiaWzUxRC7QcykJ+8V24IGiOiiTvc3fNXNupRkQapBEEo5aPAoU4QQ3KqHQRQaIDwJb8aAtVpIaTcGpnxvGr4hDUHqIVg2XgjlM9ff3vXt6BJhqRD5FIx6p+Hb2NRkx8KycSJN+OHNxp0gbCjURbDnQzHRaGkDg58Xn5e1vbFb1nzISxARQ6dWibQsBy9xresxS1acMwOkSNRAJCcnM378eKKjo+tt1+l0WFo2XAfa2OfZYBSkwMdd4d6PRdUBiXmRnySii+K2iE6nohdRA+3HCtEoeFDDdxirykRK2f6PoSIf2o+D4a+JalsSiaRhURSRhmZpI8wYpVm0RNKwFKbC6TVCMMqLFwPw9mPFICr8rqtX0bpZFEUYwqcaUsdSDoqIQBAedwF9ROpYcKSY0b9db6Hq8u8R42HysjtrsylQdFEYVds4woKdd1bJcstLcORrmPAp9JzdYE1scnIvwNKxIpJ87pbmF62dnwjb/gGxG8W9bsQbIrpFpj3dHlVldUyo9xtMqEeK0vVtRzUfMbkFIEWiBmLatGn8+uuvtG/fHmtra5ycnPD39+fkyZNs2bKlnoD04YcfUlpayhtvvEFCQgJPPvkkOTk5ODg4sHjxYiIiIq55HGOfZ4ORuFsYAs7eAGFDjd0ayZ1QlifMAOM2i3xvbQXYukLbkSLCqM2IOwsl1ajh2FLY+xGUZYubzfC/ipLxEolEIpGYM4oiChecWgXRP4pJEEdv6DJZCEZ+XW88YNXrISeufqRQySXxNzs3ESEUZPAU8u/asGLOoUWw9VUR1TtpifkKyho1LB0jxPF52+880kGnhZWTRan42b8IzzdzIy9BRBDptSKCqDlHbCfvg62vQeZpIaKOeg8C+xi7VeaBoghD8xPLIfonYULtES4ihrpNBxd/Y7dQchtcSyQy0yu88Xj//feJjo7m5MmT7Nq1i3HjxhEdHU1oaCjJycnXfN2CBQv48ssvadu2LYcPH+aJJ55gx44dTddwY1GQJNbNtfpDS8LRU1Qi6D5DGF8m7oJzm0XecfR6EYkQOkTMkLYfe/M3C22VuOHs+VB0dkOHwPAVENSvUU9HIpFIJJImQ6WCgF5iGfUuxG8TgtGRxXDoC/DuIMSirlNqjYJ1Gsg4LWbqUw+KpaJA/M3Zv74o5B3RuN5g/R8X7dn2d5G6NvFL80tBVRTY9DxcOg5Tf2iYVBhLK3hwqah4tuYhUfHMnNK0ClLguwmgrYSHNzVvgQiEiLdgt/jt/fkmfDNCCLV3v26+/kuNjaJA0h7Y9Z64Blk7CLG4xyxx/ZHRWM0S8xaJfntVGKw1JH5dYMz7N7173759CQ29/s2gtLSUAwcOMHny5JptlZWV13lFM6IgWfhcuAYYuyWShsTGweBRNFb4TqUdEUadcZth81/E0rq3YZ/x4NXuypuITgunV8Puf4lw/MD+MOkrIRJJJBKJpNFQa3QUqzUUV2gpUWsoVmsprtCg0ekZ1ckPR1vz7h6aPFY2IgI3Ypww1T37s0hH2/46bH+jNvI67ShoysRjjzCxf5DBU8g9pOkHZwOfEdVFd/xTRClN+My8TOsPfwmnVsLQV6HD+IZ7X3s3mLEGFt8Fq6YZKp41ou9UQ1GULkyqq0pgzkbw7WTsFjUNFhaiQm7H+0TV3AOfijS0AU/DwOfA1snYLTQdkvfBzvcgZZ8Qpsd8IMRsaULd7JG9gDvE0dGx5rGVlRV6vb7muVqtBkCv1+Pm5sbJkyebvH1GJz9JlCg3t9kmyc1jYWkomRsJ97wtQuHjNovlz7fE4hFe2yFu3Ut0iHe9L7wTWvWA8f+F8LvlbIREIpHcAEVRqNDoKK7QGoQeDSXq2sfVgk/xZdtK6myr0uqv+f4jOmSweHZvVPJ63DQ4eECfR8WSlyDEorM/Ce+iHjNro4VMpSrTkBdFWtKu98T9f/zH5iEUJe4SZdHbj4OhrzT8+3uGw9TlsHwirH8Epq8x7ZS84gwRQVRRINLkWmKJeFsnuOv/oOccEVW05wM4vlxUQes2wzy+141FykHY9a6IIHLyhTH/Fv8naztjt0zSRDTI1UulUo0GPgYsgSWKorx/2d+HAb8ChtwjflIU5a07PvAtRPw0FM7OzpSUlFz1b76+vmRnZ5OXl4eTkxObNm1i9OjRuLi4EBoayrp165g8eTKKonD69Gm6dWsBF+SCJHA3o7BbyZ2hUonwbZ8OoiNZfMlgfL1Z+Bkc+AQsbUFXKUrvTlsF7cdIcUgikbRoCsqqiEop4GJBeR2Rp674U18Q0uqv7ydpa2WBs501LvZWuNhZ42pvTaC7fb1tLvbWuNhVPxbr7bHZ/GtrHCuPpDKzX3ATnb1p8cmfF9h3IZdHBoVyT0dfLCya8P7kGQ53/U0spszQV0Tq2d4PRerZuP+Y9n28IBnWzQXPNoY0uUYa/IcOgbEfiJS2bX+H0e81znHulNJs4RdamgWzfhKTdy0Zt0B4YAn0fQx+fw1+fVKYkY96D0IGGrt1TUvaEdj5LiTuBEcf8T/oPddkqsHp9QoavR5bKxl80NjcsUikUqksgc+BkUA6cFSlUm1QFCXmsl33KorSgLGdxsHT05OBAwfSuXNn7O3t8fX1rfmbtbU1//jHP+jXrx+hoaH1jKl/+OEHHn/8cd5++200Gg3Tpk1rISJRskg7krRMXFpBn3liURfBhW0idDV0CHS8v0XO0pRXaUnNL8fbyRZPJ1tjN0cikTQxiqJwsbCCo8n5HEkqICo5nwvZpfX2cbCxrBFvnO2s8XKyIczbsd42l8sEH2eD4ONsZ4Wd9e11oMO9nTiQkMs/N8XQL9STNj4tK+1iZ1w2H207j5OtFQtXHKONjxNPDAvn3m6tsLZsefera6JSiQgMXZVh8sdGCCKmKBRVlcHqmaDoYPqqm0qT0ekVtkZnsnhvIsVqDXe192FER196B7tjdaPvQe9HIOe88JnyaicG2KZEWR58f59INZu5Xvo/1iWwDzy6TRjLb3sdlo2FDvfCyLdEumdzJj1KiEMJf4oS9ve8Db0fvf2KiI3A/vhcXt9wFrVGx4+PD8DXRUY1NSZ3XN1MpVJFAm8oijLK8Pw1AEVR3quzzzDgxVsViUyxullT0SzOszwf/h0qLjQDnjZ2aySSJkFRFHJLq0jNLyM1v5yUvHJS88pJyS8nNb+cnBLhR+Zsa8XPTw5scYMwiaSlodcrnM8u4WhyAUeT8jmanE9GkUhHd7a1oleIO31CPOgb6kG4txPOdlZGFSSyi9WM+t8eWrvb89PjA7GxahniSFaxmjEf78XH2ZafnhjA9thsvtgZT1xmCQHu9jw2NJzJvQJuW4BrligK/P5XIYgMeBpG/tO0hCJFgXUPQ+wGmLEO2o647u5qjY71x9JZvDeRlLxyQr0cCfJw4GBCHlU6Pa721gxv782Ijr4MaeeNi901qsfptLByCiTthod+Nh2vxfJ8EUGUe0F4KIUNM3aLTBdNBRz8DPb+F/Qa6PcYDPqLSA9tTlw8LlJHL/wB9h4w8FnoOx9sHG/82ibiUmEF72yOZfOZDAI97MkvrSLEy5G1j0VK/7wGoDGrm7UG0uo8TweuJktHqlSqU8AlhGB0tgGOLTFlCpLFWqabSZoZGp2eiwUVNcJPal6ZEIMMz8urdDX7qlTg72JHoIcDw9t7E+zpiJ+LHe9uiWXed0f55cmBuDnYGPFsJBJJQ1Kl1XPmYmFNlFBUSgFFFRoAfJxt6RPqQd8QD/qEeNDezxnLpkxnugl8XOz41wNdWbD8GB9tO8+rYyJu/CIzR6dXeG71SSqqdHw2owcONlZM6NaKe7v6syMum892xvP3X6L55M8LzBsUysz+wTjJwYm4wY16V6SeHfhUpJ7d/Q/TEYr2fQQxv8CIN68rEBVVaFhxKIWl+5PILa2iW6Abr42JYGRHPywtVJRVatl7IYftsdnsiMvml5OXsLZU0T/Mk7sjfLi7gy+BHnUiLiytYPJSWDIS1s6GeX+KVEJjoi6CFZMg55yIqAobZtz23ARFFRo2nLrE2qNpFJRXseLRfoR4NZF4YW0PQ16CHg/Bn/+EA5/BoS/F/63jBOFt5ejZNG1pDDJOCUPq87+Bvbv43fZdALbOxm5ZDZVaHUv2JvHZjngUFF4Y2Y75Q8I4mJjHvO+ieGrlcRbP7n3j6D7JbdEQkUSTgVGKoswzPH8I6KsoytN19nEB9IqilKpUqrHAx4qitL3G+y0AFgAEBQX1SklJqff3ZhFhcxM0i/OM/lGY9y3cD36djUiA5OwAACAASURBVN0aieSWKFFrSMkrJy1fRAEJEUhEB10qVKOr4wliY2VBkIcDwR4OBHnWroM8HAlwt7/qzHNUcj7TFx+iX6gny+b2kTc5icRMKVFrOJ5ayNGkfI4k53MqrZBKgzF0mLcjfUM86B0ihKFAD3uzMYR+7afTrD6axsp5/YkMN+PB0E3w2Y4LfPjHef79YFem9L6yDLaiKBxKzOeLXfHsvZCLq701cwaEMHdACO6OUuRHr4fNz8OxZaJy2PDXjN0iOP+HiObpPAke+OaqwlVmkZpv9iWy8nAqZVU6hrbz5rGhYUSGeV7zd6rTK5xILWBbbBbbY7JIyBHV5yL8nBnZ0ZcRHXzp0tpVeFnlJ4qKZ47eIo3J3q1RT/maVJbA8klw6QRMXQHtRxunHTeBoigcTspn7dE0Np/JoFKrJ8LPmeySSmytLFizIJIgTyOkQGVGi4q8MRugMAVUFhA8UFRIixgPLv6N3oTDiXm09XXG406uOZlnROGYuE2iAl/k0yJKysSqle08l82bG86SnFfO6E5+/N/4DgS4137uPxxO4W8/RzOzXxBv39/ZbO6rpsi1IomaJN3sKq9JBnoripJ7vfeW6WZmfp57PhRlUl+7aPRykpVaHRtOXmJ811bY28hQcYlIAckuqTSkhNVJDTNEA+WXVdXb38PRhkCDEBTs6UCQh1iCPR3xcba9LXPTtVFpvLz+NA8PCOGNCS2k9KxEYuZkl6g5mlTA0WSROhabUYxeAUsLFZ1audDHECXUO8QdLzP2HSuv0jL+k32oNTp+e3YIrg7XSK0xc6KS85n69SHGdfHn42ndbzjYOJVWyBe74vn9bBYONpbM6BvE/CFh0h9Dr4cNT8PJFcKvaMhLxmtLbrwQZ9yD4JE/rvBVic8u4avdifxy8iJ6BcZ39eexIeF0bHXrA+Wk3DL+jM1iW0wWR5Pz0Svg7WzLiA4+jOjgyyDrc9iunChSzmasa/qKZ1VlsOJBSDsMU74THjsmSHaxmvXH01l7NI3kvHKcba2Y0L0VU/sE0qW1K7EZJcxYcghHGyvWPNa/nmDQpCgKZJ4WYlHsBsg9D6ggsC90mCCijNyCGviQCv/54zyf7YzHwcaSmf2CmD84DJ9bueZknRXiUOwGsHWFyCeg/+NCKDIhUvPKeWtTDNtjswjzduSNezsxpJ33Vfd977dYvtqdyF/HRrBgiJEj9cyYxhSJrIDzwN3AReAoMKNuOplKpfIDshRFUVQqVV9gPRCs3ODg1xKJIiIimrViqCgKcXFx5i8S/foUnN8KL8UbuyUs25/EGxtjmNijNR9N6dasvz+Sa6PTK6w+msr3B1JIziurme0HsFBBa3d7g/jjWE8ICvJ0uLb3wB3y9qYYluxL4t2JXZjRr2E7FhKJ5M5QFIXkvPIaL6Gjyfkk55UDYGdtQY9A95r0sR5Bbs3OH+F0eiGTvjjA6M5+fDq9R7O7dxaWVzHuk31YWqjY/MwgnG/hOn8+q4QvdyXw66lLWKpUPNArgIVDwwj2NB0vjyZHr4NfHofTa4TZ78Bnm74N6mJYcjeU58GCXfUG7MdSCvhydwLbYrKws7Zgau9A5g0Oq58qdgcUlFWx63w222Oz2X0uh9JKLXbWFrzme4Q5uR9R3mMeDvf9p0GOdVNoKkQ0VfI+Ub2r8wNNd+ybQKvTs/NcDmuOprLzXA46vULfUA+m9g5kbBf/KyZ1oy8WMWPxIVwdrFmzIJJWbiZQcSs7TggvMRsg64zY5t9diEUd7gOvNnf09oqi8O6WWBbvTWJSj9boFYUNpy5hZWnBlN4BPDYk/Prf3+w42P0+nP0ZbJwN4tATxotquwZqjY5FuxJYtDsBKwsVz9zdlkcGhl7XE0+vV3h61Qk2n8ng8xk9Gde18aO5miONJhIZ3nws8D/AEvhWUZR3VCrVQgBFUb5UqVRPAY8DWqAC+IuiKAdu9L5XE4mSkpJwdnbG0/PaoaDmjKIo5OXlUVJSQmiomXv5LBsP2kqYt83YLWHcJ3u5kF1KlVbPP+/vzEP9W2Zp35bMsZQCXt8QTfTFYnoEudE72J0gT8eaNLHW7vZGMYvV6RUeWXaU/fG5rJjXj/5hzTutQ2JaFJRVEZNRTNcA11saIDdXtDo9cZklHKkRhQrILRVm824O1vQO9qBvqDCa7tzatUVUvPp8Zzwf/H6Oj6Z0Y1LPAGM3p8FQFIWFK47xZ2w2Pz4+gG6BtzdoSssv56s9CayNSker03Nvt1Y8MawN7f1Mx9ujSdFp4ecFwnJg1HtiUNpU6PWweoYw4Z39K4QORlEUdp7L5stdiRxJzsfNwZrZkSHMiQxu1AqjVVo9h5Py2B6TxfbYbOaWfs08q99Y5PQk+l6PMKKDL+18nRpvLKNRi/9Fwg6Y+CV0m9Y4x7kNknLLWBuVxvpj6eSUVOLtbMsDPQOY0juAMO/rZx6cSitk1pLDeDjZsGZBJH6uJhTBl5cAsRuFaHTxmNjm07E2wsin4y35den1Cm9sPMv3B1OYHRnMG/d2wsJCRUpeGV/uTmD9sXT0CtzXXVxz6hVCyTkPu/8lfoc2jtBvIUQ+aXLG24qi8EdMFv/cFEN6QQUTurXir2M73PTnqtbomLnkMGcuFrFqfj96BZvW+ZkDjSoSNRZXE4k0Gg3p6emo1WojtarxsbOzIyAgAGtrM++w/7czBA+ASV8btRkxl4oZ+8le/jG+I3su5LA/Ppd1CwfQ/TY7hBLzIqekkn9tjWP9sXT8XOz427gOjO/qb1Iic7Faw8TP95NfVsWvTw4yTr69pNmjKAoJOWUcTykgKiWfYykFNX4aTwwL5+XRzd+g+FqcSivkwz/OcSK1kNJKLQCt3ezpE1IbKRTu7XRbaaXmjk6vMH3xIWIuFfPbs4MbLOrC2Cw/mMzffz3L38Z2YP6QOy9vnV2s5pt9Saw4lEJZlY6RHX15Ylg4PYLc77yx5oZOIzwpYzfA2A9FtaSmYMc7sOffMObfaHrPZ+OpS3y1O5FzWSW0crVj3uAwpvYJbPKIP0VRiLtUiP36mQQWHGRW1Wsc1Hci0MOeER2Ej1HfUI+GE521VbD2IRHNP+Ez6PlQw7zvHVBRpWPLmQzWRKVxJCkfSwsVw9t7M6V3IMMjfG7p3I+nFjD7myP4ONuyekH/W0u7aiqK0oVgFLMBUg8CCniEGyKMJkCrHtcVjHR6hb/9fIbVR9NYMCSM18ZcmUWTUVTB13sSWXUklUqtnjGd/XiuuwXtzi2CM+vAyh76LRC+QyZosp2YU8qbG2PYfT6Hdr5OvDmh82353+WXVTHpi/0Uq7X89PiApjM3byY0G5FIYiZoK+FtXxj6Mgz/q1Gb8ubGs/xwKJXDf70blQrGfbIPgI1PD7oz8zeJSaPR6fn+YAr/23YetVbHvMFhPDW8jcmmgyTllnH/5/vxdbHlx8cHyKgOyR1TUaXjVHohx1IKOJ5SwLHUAgrLRZUtNwdregW50zPYnZ+Op+PjbMeqBf2N3GLj8fyak/x+NpNJPVvXeAqZRCqDiZBeUM6Yj/fSzteZNQv6m73RfmxGMfd9vp/IME+WPtynQcW/wvIqvjuQwtIDSRSWaxjYxpMnh7UhMrx5RsBfE20VrJsD57bA+P9B77mNe7yYDbD2IbRdZ/C990t8sz+Zi4UVtPd15rGhYdzbrZXxI//UxfDNSPTFmWzut5yfU+3ZH59LpVaPs50Vw9r7MKKDD8Pa+dy+B5hOA+vnCoFi3EfQ59GGPYdbQFEUzlwsYs3RNDacvERJpZYQTwem9AnkgZ4Bd+TjFZWcz+xvj9DKzZ5V8/vj7WzC/m8lWcIoOnYDJO0FRQeuQcIfquMECOgLFrXfTa1Oz0vrT/PziYs8fVcb/jKy3XWvHXmllfy0fQ8+Jz5hPHvRWthS0Gk2fmNeAUevpjjDW6KsUstnO+NZsjcROytLnhvZjtmRwXf0+0zKLWPSF/txtbfmpycGyvHdLSBFIknTkhsPn/WC+7+E7tON1owqrZ7+7/1J/zAPvpjZCxAeCw8uOkj/cNE5NLXyw5I752BCHm9sOMu5rBKGtPPmjXs73jCE2RTYdyGXOUuPMLy9N1891Ft+NxuZ7TFZvPbzGVq72RPu7US4jyNhXk608XEkyMPxurnwpkhGUQXHUgpqRKGzl4rRGqrwtfFxoleQO72ChTAU7u1Y0+n8v1/O8OuJS5x6/Z4WGSkDcPd/dhHq5ciSOX2M3RST5deTF3l29UmeH9GOZ0dctUCtWVBepeXeT/dRrNby27ODG81cvKxSy6ojqXy9J5Hskkq6B7rx5PA23B3h03J+Z9pKWDNLpH/d9zn0mNU4x8k6i7JkBJm2YUwo+ys5FdA3xIOFw8IY3t7HtMS5/CRhqu3gAfO2U27pzL4LuWyPzWJHXDa5pVVYWqjoG+LBiI6+jOjgc/M+V3VT/Ub/C/ovbNxzuQaF5VX8cuIia6LSic0oxtbKgnFd/JnSJ5B+oR4N9nkcTszj4aVHCfQQQlFjpg82GOX5QjiN2QCJO0FXBU5+0GE8dJiAJjCS59ZGs/lMBi/e046n7rrBtTY/SRQKOrUKxdKak74P8OKlYSRUONI/zIOnhrdlYBvTEKgVRWHzmQze2RxLRpGaB3oG8MqY9vg4N0wkWFRyPjOWHKZra1dWzOt31crCkiuRIpGkabmwDX54EOZuheBIozVja3QGC1ccZ+nDfRge4VOzfeXhVP768xmeG9GW50a0M1r7JA1LRlEF72yOZdPpDALc7fnH+I6M7OhrEjfHm+W7A8m8vuEsjw8L55UWnP7TFPzt5zP8eDydnkHuJOSUklVcWfM3SwsVQR4OhHs7CgHJ24kww2NTKHmt1emJzSjhWEo+x1ILOZ5SwMXCCkAYKncPdKNXsBCFegS6X7fNa4+m8fKPp/nzhaGEm4GY2tCUqDV0ffMPnh/RjmfuNl/xoyl4bvUJNp7OYN3CSHqaaRrVK+tPs/ZYGise7cfANo0/y67W6Pjp+EW+3J1Aan457X2deWJ4OOO6+Jt9RNZNoVHD6umQsBMmfgXdpjbo21+8dBH7ZSPQVpYzvvIdunWMYOHQcHoFm/D3M3k/fH8fhAyEmevBUkQN6fUKJ9MLDT5GWZzPKgXA3cGaYE9HQr0cCfF0JMTLwbB2xNXeEHGk18EvT4gy7UYwDdfrFQ4m5rHmaBpbz2ZSpdXTpbUrU/oEMqFbq9p2NjAH4nOZu+wooV6OrJrf3yTuzzeNuhjO/w6xv8KF7aCtoMTClc1VPXDt9QBj7p0GVtc4n8JU2PMBnFwJKkvo/QgMeg6c/Siv0rLycCqL9yaSVVxJt0A3njKyQH0+q4TXfz3LwcQ8OrVy4a37OjWKf9Cm05d4auUJxnf155NpPVqOIH8HSJFI0rQc/hp+ewleOAfOfkZrxiPLjhJ9sYgDr95VrzOmKAovrDvFzycusvThPgxr73Odd5GYOpVaHd/sS+LTP+PRKwqPDwtn4dBws5xFUBSFv/0SzcrDqfx3ajcm9mg+RrGmxgOLDmBpoWLtY0LILlFrSMotIyGnlITsMhJzxTopt4wqXW0lPA9HG8K8HOtFH4X7OBHobt9og76icg3H0wo4liwihU6mFVKh0QHg72pXIwj1Cnang7/LLYVtx2UWM/p/e/nf1O7c36N1o7TflDmQkMuMxYdZOrcPw+W94LoUqzWM+d9erCxVbH5mME4mmr57LaqjoZ4cHs5Lo5pWhNfq9Gw6ncEXu+I5n1VKkIcDC4eG80Cv1thamd+96paoW2Vr0mLo8uAdv2XMpWIW7z7HpNjn6aeK5euwTxg9ZgJtfMzEMPz4ctjwFPSZD+M+vOouKXll7IzL5nx2Kcm5ZSTnlnGpqL4nq4ejDaEedrykWUT/ws3EdnwW7YAXCPFyaJK09YyiCtZHpbP2WBpp+RW42FkxsUdrpvQJpFOrpimvvvdCDo9+F0VbHydWzut/+6l6RkRdVszipYsJytrOGJtT2OjKRKn69qOFh1Gbu8HaHgrTYO9/4MQK4WnUay4Meh5crqzsVanVsf5YOl/uTiAtv4IIP2ceHxbO+K6tmixSvUSt4ePtF1h2IBlHWyteHNWeGX2DGvX4X+5O4P3f4uRk600iRSJJ07L1rxD1Lfwt45ac/BuS7GI1/d/7kwVDwnl1zJUXiYoqHRO/2E9msZpNTw8iwL15mHG2NHady+bNjTEk5ZZxT0df/j6+o9kbq2p0emYtOcyJtELWLOjfMo1PGxm9XqHrm38wqWdr3rqv83X31ekVLhZUCPEop5SEHCEkJeaUkltaVbOftaWKYE/HmuijMG8nwr0dCfN2uqVZVEVRSMotq0kdO5ZSwIVsMaNsaaGio79LPVHoTr1ztDo9nd/4nel9g3j93k539F7myFe7E3jvtziO/32k9DG4CY4m5zP1q4M80DOADyZ3M3ZzbpqUvDLGfbKP9n7OrF7Q32j+NHq9wvbYLD7flcCptEJ8XWyZPziM6X2DTNYzr0GoKoMfJkPqIZi8FDred8tvoSgKhxLz+XJ3ArvP5/C67UrmqjZROPIj3AYaz3vntvnj/+DAp7dk7q3W6EjNLyfJIBol55YyPOHf3FO+iY+1E/mvdnLNvl5ONgR7iuijUC8HQmoikRzvSOCt0urZEZfF6qNp7Dmfg16BAeGeTO0TyKhOfkaZoNt5LpvHvj9GhL8zyx/t12iRS41BeZWWed9FcTAxj/cndWFqdx9I3CU8jOI2g7oQrB0hsA+kHABFgV5zYNBfwPXGEztanZ4Npy7xxa4E4rNLCfF04PFh4UzsEdBoafWKovDziYu8uyWOvLJKpvUJ4qVR7ZvkHqsoCv/3SzQ/HE7l3YldmNEvqNGPac5IkUjStKyaLvJknzxktCZUK8nXS6FIyi1jwqf7CPN2ZO3CyOY/m9eMSMsv561NMWyLySLMy5HXJ3RiaDtvYzerwcgvq+K+z/eh1ujZ8NRA/F2liW5DkpZfzuB/77zjDkRRuYaE3FISsktJzC0jIVsISSl55TV+QABeTrZCPPJxElFIPk608XailZs9Gp2e0+lFtX5CqQXklwnxydXemp5B1aljHnQLdMXBpuEHkg8uOgDA+scHNPh7mzpP/nCcU+mF7HvlLmM3xWz4zx/n+HRHPF/M7MnYLlfOYJsaVVo9k788QFJuGVueHWwSk0KKonAgIY/Pd8ZzICEPNwdr5g4IZc6AYNwcmqlYWVkCKx4Q5cGnfA8R427qZTq9wraYTBbtTuRUWiFeTja81yaWkXF/v24kjsmj14ky9Re2waz1EH6L1yBFga2vweFFMPA5Kob8nZSCciEe5Yl1Um4ZyXll9dKpQdyTQuukrdVNY7uWWBmfXcraqDR+PJZOXlkVfi52PNgrgCm9A02iKuufsVksXHGMTq1cWf5oX7MoAFKi1jB36VGOpxbwnylXiR7XaSB5r/AwStoDoYNh8IvgFnjLx9LrFf6IyeSznfFEXyymlasdC4aEMa1vUIMKe2cvFfH6r2eJSimgW6Abb03oRLcmriit1emZ930Uey/ksmRObxklfB2kSCRpWr6IBPcQmL7KKIdXFIURH+3GzcGGH28w6NkancnCFceY1T+It+/v0kQtlNwuao2ORbsSWLQ7ASsLFc/c3ZZHBoaancnwzXA+q4SJn+8nzNuJtY9FYm8jRcyG4o+zmSxYfoyfnhjQKN4qGp2etPxyEnLKSLwsAqm6whiAjZUFiqKg0Yl7cZi3Y43BdO8Qd8K8mqbs+psbz7L6SBpn3rinZfik1GHwv3fQpbVrTXEDyY3R6PQ8+OVBknPL2PrcYJMXsd/dEsvXexJZNLMnY0xQ1DqeWsAXOxPYHpuFo40ls/oHc08nX/xc7fFxtjV+Va6GRF0My++HjNMwbSW0u+eau1Zqdfx8/CJf70kkMbeMYE8H5g8OY3KrXGy/Hwute8PsX2o8fcwSdTF8OwqKLsL8P8HrJn3RFAW2/QMOfAL9n4BR7143cr+8SktKtXCUVx2FVE5yXhnZJfUFJB9nW4NwJKKPHG2s2HDqEsdSCrCyUHF3Bx+m9QliSDtvkyuw8fvZTJ784TjdAt347pG+Jp0SW1SuYfbSI5y9WMTH03owrmvTXJsURWH3+Rw+3xnP0eQCvJxseHRQGLP6B92RsFZUruE/286x4lAKbg42vDK6PZN7BRrNF6i0UsuULw+SklfG2oWRTZb+aG5IkUjSdCgKvNsKej0Mo98zShOOpxYw6YsDvD+pC9P63jhK4L0tsXy1J1F6wJgwiqLwR0wW/9wUQ3pBBRO6teKvYzvg59owVRFMle0xWcxfHsW4Lv58Or2HWZlwmzKf/nmB/2w7z9k3RzV5ikd+WZXB90iIR1aWFjXl6I2V7vTziXSeX3OKrc8NJsLPxShtMAb5ZVX0/Oc2Xh0jzG4lN09SbhnjPtlL90A3Vjzaz2QNQnedy+bhpUeZ2S+Idyaa9kRQXGYxi3YlsPHUJaoDEVUq8Hayxd/VDn9Xe/xc7fB3tTOs7fF3tcPHxda8IqErCuH7CSjZceSMX0a6ZyQ5JZXkllaSU1K7nEwrJLukks6tXVg4NJwxnf2xLM+Br4eBygIW7DLJEt+3TEGKqHhm5wrztovKZzdix9vCuLjPPJGudgd9g7JKLcl5taJRsiH6KCm3nNxSISCFeTsyrU8gE3sEmHa5eWDLmQyeXnWCXkHuLHukT6NE394p+WVVzFpymPjsUj6f2ZORHX2N0o7DiXl8tjOevRdycbGz4uGBocwdEHJLBuB6vcLaqDT+/fs5CsureKh/MH8Z2d4kvKGyitXc//l+9IrCL0/KqPyrcS2RyPR+NRLzpzQLNOXgHmq0JqyLSsfO2uKmVfmXRrXnRFohr/10hg7+Li1qkGQOJOSU8ubGGPacz6G9rzOr5vcnMtzT2M1qEkZ09OXlURH8a2sc7X2deVpWX2oQ4jJLCPZ0MIoHiIejDR6OHvQJafjKHrdL1wARCn46vahFXf9OpxcC0LW1nGG8VUK9HHn93o688uMZluxLZMEQ0xPZsovVvLD2FO19nfn7+I7Gbs4NifBz4eNpPXhldATns0rILFKTUaQmo6iCjCI1CTml7I/PpaRSe8VrvZxs8HO1w89FCEf+bgYxyfDcz9WuSbxitDo9+WVVZJdUklNH9KknAJVWUlnyLIv1bxL2y2w+1LzEAX2tN5ynow3ezrZ0D3RjdmRIbQlvbRWsnSPKiD+ytXkIRADuwTB1BXw/AdbNgVk/XT86avcHQiDqORvGfHDH3p+OtlZ0auV61UiLErWG/LIqgjwczGaSamwXf3R6hWdXn+DRZVF8+3Afk4rEzi5RM2vJYVLyyvl6di+jFs/pF+ZJvzBPTqUV8vnOeD758wJL9iYyq38w8waF4uNy/YnYU2mF/OPXaE6lF9EnxJ03J/SjYyvT6UP4utixdG4fHlx0kLlLj7JuYaRZpCGaAlIkkjQ8Bcli7R5ilMNXVOnYeOoSYzv73/SFwMrSgs9m9GDcJ/t4fMVxNjw1UF5ETICySi2f7LjAt/uSsLOy5PV7O/JQ/+AWlw6zcGgY57NK+M+287T1dWJ0Z9NLlzA3YjOLifAzkyo4TUCopyPOtlacSS9iSu9b9zowV86kFwHQOUCKRLfDlN6B7IjL5oPfzzGwjZdJhfPr9QrPrz1JWZWW1TP6m1W1y1Zu9tc1pC9Ra8gqrhaQ1AYxSQhJ6QXlHE3Op6hCc8Xr3B2s8XOtFY38Xezwd6vz3NXuqlEXiqJQVKGpJ/LUjfipfp5bWkleWRVXS1JwtrXC29kWLydbOvi54N3Wm4N239DqzOMsL/+IlDHf49huKB6ONtdOr9v6KqQegAe+gVbdb/r/aRYER8K9H8Mvj8OWl2D8f68u/uz7H+x8G7pNh/Efg0Xj9oec7azNsj98b7dWaPV6/rL2FPO/j2LJnN4mcQ3ILFIzY/EhMorULH24DwPamIbQ2S3Qja9n9+ZcZglf7Ipnyd5Elh1IZmrvQBYMCbuiIEx+WRX/3hrHmqg0vJxs+e/UbtzfvbVJCokRfi4smtWTuUuP8sQPx/n24T7NK4W3kZAikaThyU8Saw/jRBJtPZtBaaWWB3vfWtqYj7Mdn03vwYwlh3lp3WkWzeppkhe7loCiKGw8ncE7m2PIKq5kcq8AXh4dYfIhzo2FSqXivUldSMot4/k1pwj0cDCpwZi5UVGlIzm3jHu7tjJ2U0wGCwsVnVu71kTWtBROpRcR5u2IixkOgkwBlUrF+5O6MvrjPTy7+iQbnxpkMjP2i3YnsD9eVAtq69u8BOHqgfv1yr2XV2nJrBGQ1GQWq7lUWFHz/GRaYY1Bfl1c7Kzwd7XHy9mGUrW2RgSq9k2ri42lhRB+nG0JcHegR5A73s62YnESax+DMHTN78WALbBsHGG/zwWfn8Cl/9X3O7YMor6BAc9Alwdv5t9kfnSfATlxsP9j8OkA/R6r//eDX8D216Hzg3Df540uEJk7E3sEoNPDS+tP8djyY3z1UC+jCkXpBeXMWHyY/LIqvn+0r0lFE1fT3s+Zj6f14PkR7fhydwKrj6ay6kgq93VvzRPDwwnxdGTl4RQ+/OM8ZZVa5g0K5Zm725q8kDi4rTfvTOzMKz+e4e+/RPPepC5yjHcDpEgkaXgKkgEVuBmn5OC6qHQCPezpH3rr6Uj9wjx5dXQE72yJ5Zt9ScwbHNYILZRcj7jMYl7/9SyHk/Lp0tqVRbN6NYqxsLlhZ23J1w/1YsJn+1nw/TF+fWogXk4tUzS7Uy5kl6BXoIN/8xo43ildA1xZuj+ZKq2+WRrBX40zFwuJDGsZqauNhbujDR9O7sZD3xzhvd9ieeu+zjd+USNzLCWfj7adZ3xXf6b2aTmRcXVxsLEizNuJsGtUdwVRCKI6Iuny1LackkpcHWxo4+NcK/zUEX+8nWxxsbe684GWkw/MsdHO6gAAIABJREFU2QhLx8KKB4URdcBl9hiph2Hzi6L614g37ux4ps7dr0PuBRE15dkG2twtth9dAr+/Bh0mwMSvwMI0xFhT58FeAej0el758QxP/HCcRbN6GsW/Kzm3jJlLDlOi1rBiXj+6N3G1r1slxMuR9x/oyrMj2vL1nkRWHUnlpxPptHK152JhBQPCPXlzQiezEuCn9gkiLb+Cz3bGE+jhwJPD2xi7SSaNFIkkDU9BEri0BqumH8Cm5ZdzICGP50e0u20TzXmDQzmWUsB7v8XRNcCNvqGmp/Q3R4oqNPx323mWH0rB2c6Kdyd2YWqfQJOrnGFMfFzsWDy7N5O/OsDC5cf4YX4/8zIrNRHiMkoAaN+CvHduhi4BrlTp9JzLLKFLC0i/yipWk1VcWePHJLl9Brf1Zt6gUJbsS2J4ex+GRxjPY6OoXMMzq07Sys2Od+Vs8XWxs7Yk2NORYE9H4zbE2U8IRcvGwvJJQihq3VP8rfgSrH0IXAPgwW+bvzhiYQmTvoZvR8O6uTBvG6Qdhs0vQPuxItXOUg7fboWpfYLQ6BT+75donlp5gi9m9mzSdKP47FJmLD6ERqdn5fz+dDYjDzx/V3tev7cTTw5vw7f7kjiSlM9rYyMY18XfLK+tL9zTjrSCcj74/RwB7vbc1721sZtksrSMqUJJ05KfZLRUsx+Pp6NSwQO9bv9Hr1Kp+PfkrgR5OPDkyuNkl6gbsIWSy6muinDXh7v47mAy0/sGsvOFYczoFyQFoqvQJcCVDyd3IyqlgP/7ORpTrlBpqsRmFmNvbUnQZTn2LZ1u1ebVF1tGytmpNINpdQsQxJqCl0a3J8LPmZfWn6qpiNTUKIrCqz+dJqtYzSfTesg0QnPCtTXM2QT2rrB8ImScBo0aVs+EqjKYvgrsW0hUsa2zOF8rG1g2HjY8A21GwuRlYpvklpnVP5g3J3RiW0wWz6w6gUanb5LjxmUWM+3rg+gVWL0g0qwEorp4Odny8ugI1j8+gPFdW5mlQASGMd6DXekb6sFL605zODHP2E0yWaRIJGl4CpJFpYYmRq9XWH8snQHhngS439ngz8XOmkWzelKi1vD0yhNom+hm0tI4nV7IpEUHeHn9aYI9Hdj41CDevr/LLZXebImM79qKZ+5qw7pj6XyzL8nYzTE74jJKaOfnLEXIywhwt8fNwbrGzLm5c+ZiEZYWKunv1UDYWlnyyfQelKi1vLz+tFEE7JVHUvktOpMXR7Wnh0xTNj/cAkVEkY0TfH8frHsYLh0X6VU+HYzduqbFLQim/gDqIggbClOXGyVCvzkxZ0AIfx/fkd+iM3l+zclG79tHXyxi2teHsLKwYM1j/Wkvi2WYBLZWwr4hwMOeBcuPkZBTauwmmSRSJJI0LJWlUJYN7k0fSXQoKY/0ggom92oY/4EIPxfendiFw0n5fPDHuQZ5T4kgv6yK1346w32f7ye9oIL/TO7G+oUDzHaGxRg8N6Idozv58e6WWHaeyzZ2c8wGRVGIyyymg+ysXYFKpaJLa1dOtRCR6FR6EW19nEzGaLk50M7XmdfGRLAjLpsVh1Ka9NhxmcW8tTGGwW29WCD9BM0X9xCYs0EIIud/g6GvQofxxm6VcQjqB89Hw8wfwfra1e4kN8+jg0J5bUwEm05n8MK6U+j0jSNmH08tYPriQzjaWLH2sUjCr+MNJml63BxsWPZwX6wsVMxdetRo0a+mjBSJJA1LoaFTaIR0s3VR6TjbWjGqk1+DveekngHM7BfEV7sT+f1sZoO9b0tDq9OTXlDOocQ8vt6TwPAPd7E2Ko1HB4ay48WhPNAr4LY9pFoqFhYqPprajfZ+Ljyz8gTx2XIm5GbIKamkoFxDhBSJrkq3ADfOZ5Wg1uiM3ZRGRVEUTqcXylSzRmDOgBCGtvPm7c2xxGeXNMkxK6p0PLXyBM521nw0pbu8n5g7nuEw9zdRBn7oK8ZujXFx8pEeRA3MY0PDeWlUe349eYmX159G38BC0ZGkfB5achgPRxvWLowkyFOmtpsiQZ4OLJnTm6xiNfO+i2r2/Z5bRV51JA1LviH1xT2kSQ9brNbwW3QGk3oGNPis8D/u7ciZi0W8uPYU7Z92JsTLyAaPJohWpyezWE16QYVhKa+3zihS15utiQzz5M37OtHOjKoimCIONlYsnt2L+z/fz7zvjvLLkwNxc5CpetcjNlMMWiP8pWn11egS4IpOrxCTUdysqwqmF1RQWK6RptWNgEql4oPJXRn9v708s+okPz85oNEN9t/adJb47FKWP9oXb2eZktMs8Ag1mr+lpPnz5PA2aHUK/91+HisLFe9N6tIg4vL++FzmfRdFKzc7Vs7vj6+LXQO0VtJY9Ahy5+NpPXj8h2M8t/okX8zsKScZDEiR6P/Zu/PwRs/yXvzfR5IteZElebe12LPbM2PZlodAwpZAYEIIhASmEMJyoD1hLaX0sLYF+juFnlMolKRJIRRKOayZhBCWdCYLZAFKkxl7vI3l2eyxZVtexrIk71qe3x+SJ5nEu5b3lfT9XNdc71h+/b5PEseWbt3396Hk8g3GjmkeN/t11xgWQ1EcabMl/dp6nRb33O7CTXf9Dh/8wUk8+OGX59x4wlaLQEIAVUYDbJYCHKqzwGYphM1SAJulEPbSAjhKCzM29E5tbJZCfPNdbbjt23/ER37Uju+976q07tqRadxjAQBgJ9EaLodXD89kdZGo08PQ6lSqNBrwj2914s++fwJfe+QMPntj6vJkftk5ih8/M4wPXbsLr9xTkbL7EFF2+Yvr9yAcjeKu35yDVivwpbccTOi56W/dE/jAD05iZ3kR/t+fvpQF6wxxw8Fq/M0b9+N//+o0vvxwH/7mpv1KL0kVWCSi5PINAHpT2negOHpiGLsri9FiT827wjZLIf757S143/eexd/8vAdfPeLMqiJHMotANksBaswGbs2eRofqS/HlW5rwyfu78Pe/Oo2/u/mg0ktSLbc3iBqTgR1Xa6gq0aPCqEfXSHbnEnV7/MjXatBQzY6yVLl+fxVuf6kD9z59Aa/eW4Frdpcn/R7D0/P43M+60eow4xOv25v06xNRdvvE6/YiHJX41yfOQ6cR+Ls3H9jW8/vjvV589Eft2FdtxP97/0u5AUuGef/L6zE8PY9/+90A7KWFeO819UovSXEsElFyTQ8ApfWxKkKanJuYRfvQDD77hoaUFm6u3VeJj71mD77x+FkcqrfgtqscKbtXqlyYjP272qgIBMReLNoshWirs8BmKYDdUsgikIodOWRHvzeIf/vdAPZWG3H7S9O/w2Am6BsLcIeRdQgh4LSa0JXl4dWdnhk01hiRr2PXXSr9zRv3478uXMIn7uvEsY+/MqnF2VAkio/+uAMQwJ3vaGUHJRFtmRACnzq8D+FIFN9+egBajcDnb9q/pdcTv+wcxcd/egpNVhP+4/1XwVSQl8IVUyoIIfC3N+2HxzePv/tlL6zmAly/v0rpZSmKRSJKLt8gUN2U1lvef9IDrUbgFpc15ff62Gv3oH3Ihy881IuDtSY0ZciowkRgEV9/7Ax++uwwVmpBLywCPb8bqJZFoIz02RsbcXZiFl94qBc7y4tx9a4ypZekKsvhKM5PzuLafZVKL0XVnDYzftM/gdmlMIr12fc0IRqV6BkJ4C2ttUovJesV5Gtx5ztaccs9v8fnHuzG3e90Je3NnK8+0o/O4Rnc/U4X7KUMhiWi7RFC4HM3NiIclfj33w8iT6vZ9BvPD5z04JP3d+JQXSm++76XZOXvzFyh1QjceVsr3nHvH/HnP+7AfR+4OmNe56UCv5MpeaIRYGYIaHxT2m4ZjkTxQLsH1+6tQKUx9eFwWo3AN97RipvufBof+uFJ/OrPX6HqsZX55TC+/dQAvvXUeYQiUfyPa3bg9pc5YDUXwJDHIlC20WoE7npnK265+/f48A9P4qGPvIK7ajzPhalZhCISjTXsJFqP02aClEDviB8v3Zl9hcYLU3OYXQoztDpNDlpN+MTr9uH/HnPj/pMeHDlkT/iaT52ZxLeevIDbrnLgjc6aJKySiHKZELEOonBE4t6nLkCnEfjk4X3rFop+9N9D+Oufd+OaXWX49nsOoTCfL6szXWG+Dv/23kO45e4/4P3/8Swe/PA1sFly83k0e3MpeQIjQDSU1t0onjo7icngUlKedG5WaVE+7nlXG8YDi/jLn55K+taZyRCJStz37DCu/coT+PpjZ3Dtvgo8+pevxufftB+7KopZIMpiJYY8/Nt7X4KoBP7s+88iuBhSekmq0b+ysxlzaNa18s5Zto6cdcVDq5tZJEqbO161Ey/dUYov/qIXFy/NJXStieAiPnHfKeytKsbnGTBKREkiRCyT6LarHLjnifP4+mNn1zz3e78fwOce7Ma1eyvwnfe+hAWiLFJpNOB773sJFkMRvO/fn4V/ITefR7NIRMkzPRA7WurTdsujJzwoLcrHaxrSOz7SYjfj8zftx2/7J3H3b8+l9d4beerMJN5459P41ANdsFoK8MCHrsY9t7ehvrxI6aVRmuwoL8I9t7twfnIOH//JqRflTeWqvrEg8rQCOyv4/8J6yov1sJoLsja8usvjR0GeFrv4fZA2Wo3A19/eAq1G4OM/PYVwJLqt60SjEn91XyeCi2H8yztdObfTKBGllkYT2+XsTw7ZcOfjZ3Hn4y8uFH3ryfP44i9P4/X7q/DNd7fxjdcstKfKiG+9qw2Dl+bwoR+cxHJ4e7+zMhmLRJQ8vpUiUXo6iabnlvFY3zje0mJVJHz0XS+rw1taavG1x87g6bOTab//C7m9Abznu8/gPd99BnPLYfzLO1vxsw9dg7a6UqWXRgp4+e5yfOFN+/G4ewJfOd6v9HJUwe0NYHelkQG3m9BkNaE73nGTbbo8MzhoLYGO3wdpVWsuwJduaULH0Azu+s323lz51lMX8PTZKXzhTQewt4pjo0SUfBqNwD/c6sStLiu+9ugZ3PNE7OeVlBJ3Pn4W//CfbtzkrMHdt7uY35nFrtldjv9zqxN/OH8Jn/1ZN6TMrTdc2RtHyeMbBDQ6oCT1AdIA8NCpEYQiEkcO2dJyvxcSQuDLtzbh9FgAf/GTU/jVn78CteaCtK9jPLCIrz1yBkdPDqNYr8PfvLER7766jr+4CO9+WR3c3iC++eR57K0qxq0uZf5fUQv3WBDXMMx7U5x2E471euGfD8FUmD07tYQiUfSOBrj7n0Le1FyL3/ZP4K7fnMWr9pZv6U2M9iEf/umRfryxqQa3XZW+EXMiyj1ajcBX3taMSFTiH4/1Q6cR8C+EcPdvz+NWlxVfeVsztJr07eRMynhrmw3Dvnn882Nn4SgtxF9cv0fpJaVNUt5GE0LcIIToF0KcE0J8ZpXPCyHEnfHPdwkhXMm4L6nM9ABgdgDa9NQej57w4KC1BI01yuWLFObr8K/vasNyOIoP/7A9re2Ic0thfP3RM7j2K0/gZx0evO/lO/DUp67Dn71yJwtEBOC5+fqX7SzFZ37WjfYhn9JLUoxvbhnewCIaGFq9KU5rLK+nO8tGzs6Oz2IpHEWzPXd3LFHa3735AKyWAnz8p6c2nZnmXwjhYz/uQFWJAV++tSlpO6QREa1FqxH4pyPNeKOzBl9+2I27f3set11lx1dZIMopf/HaPXiry4avP3YGD5z0KL2ctEm4SCSE0AK4G8AbAOwHcJsQ4oVJgm8AsCf+5w4A/5rofUmFfINpGzXrGfHj9FgAR9qUfzdxV0Ux/vFtTpwansGXH+5L+f0iUYmfPjuE6776BL7x+Fm8pqESj33i1fjbm/areqc1UkaeVoN7bm9DVYked3z/JMb8C0ovSRHueGj1PoZWb0qTNVZE6cyykbOV0GrubKYcoyEP//z2Foz4FvDFX5ze8HwpJT73s26M+Rdx1ztbYSrIns42IlI3nVaDf357C971Mgf+/DW78eVbmqBhgSinCCHwD7c24ZpdZfj0A134w7kppZeUFsnoJLoKwDkp5QUp5TKAnwC4+QXn3Azg+zLmjwDMQgjuWZptfANpC62+/6QH+VoNbm6pTcv9NnJjUw3+9BU78L0/DOIXnaMpu8+TZyZx4zeexqcf6IbNUoAHPnQN7r7dhboyBrDS2kqL8vGd974EC8th/M/vn8DCckTpJaWd2xsAADRWs5NoM0yFeagvK0R3lu1w1jXih9GgQ11pbm5pqxZtdaX46Gv24IF2D37Vtf7vzJ88O4xfd4/hr16/Fy6HJU0rJCKKydNq8PdvacJfvX4fuxhzVL5Og399Vxt2lBfhAz84ibPjQaWXlHLJKBJZAQw/72NP/LGtnkOZbMEHLPqB0tR3Ei2FI/j5qRG87kCVqjpnPvOGBhyqs+AzD3Ql/YdH31gA7/7Of+O9330GC6EI7rndhQc+dA3a6viEmTZnb5URd97Wit7RAP7X/Z05F8DnHguitCgfFUa90kvJGE02c9aNm3V5ZuC0mfhOsAp87DW70WI343M/68bozOodjmfGg/jiL3rxit3l+OCrdqV5hURERDGmgjz8+/teAkOeVnU7W6dCMopEqz3TeuGrj82cEztRiDuEECeEECcmJ5XfMYo2aXplZ7P6lN/q8b4JzMyHcKRNXSG8eVoN7r7dhcJ8LT74g5OYXQonfM3xwCI+dX8nbrzzaXR5/Pjbm/bj0U+8Cjc21fDdDNqy1zZW4dM3NODXXWPb3l0oU7nHg2ioNvL/my1wWk0YmVnA1OyS0ktJisVQBO6xIJqsHDVTA51Wg2+8owWRqMQn7juFSPTKp4WLoQg++qN2GA06fO3tzSzsERGRomyWQvz0jpfh/77NqfRSUi4ZRSIPgOcHw9gAvLB3eDPnAACklPdKKQ9JKQ9VVFQkYXmUFr6VIlHqO4mOnhhGdYkBr9yjvu+PqhID7rrNhYGpOXz6ga5td2vMLYXxtXgo9c87RvFnr9iBpz55Hf70FTsYSk0J+cCrduLW1ti2ro+dHld6OWkRiUqc8QbRwDyiLXHaYrlE2TJy5vYGEY5KNNsYWq0WdWVF+MKbD+CPF6bx7acvXPG5/+9Xp3FmfBb/9CctqDQaFFohERHRc3ZWFOfEa7FkFImeBbBHCLFDCJEP4B0AfvGCc34B4D3xXc5eBsAvpRxLwr1JLXyDsWOKO4nGA4t48swkbnVZVbuzwNW7yvDJw7Fuje/9YXBLXxuORPHjZ4bw6q88gTsfP4vXNsZCqf/6jfuzahtqUo4QAl++tQk2SwF+/MyQ0stJi6HpeSyEItzZbIsOWE0QAujKkiLR5dBqOzuJ1ORImw03NlXjnx7pR098vPHXXWP40X8P4QOv2olX71XfG0JERETZLOG9yqWUYSHERwEcB6AF8F0pZa8Q4oPxz38TwMMAbgRwDsA8gPclel9SmekBoKgC0Ben9DYPtHsQlcDbVDZq9kIffPVOtA/58KVf98FpM6GtrnTd86WUeOLMJP7h4T6cGZ/FoToL7n1PG0M6KSUMeVq8dEcZnuifgJQy60ew3GMrodXsJNqKYr0OuyuKLxdXMl2Xx4+yonzUmtiVoiZCCHz5lia0X5zBx37SgW+9qw2f+VkXmu1m/NXr9ym9PCIiopyTjE4iSCkfllLulVLuklJ+Kf7YN+MFIsR3NftI/PNNUsoTybgvqYhvMOWjZlJK3H/Cg5fUW7CzIrXFqEQJIfDVI82wWgrw4R+2r5vp0Tvqx7u/8wze9+/PYjkcxTff5cLRD17NAhGlVKvDjEtzyxieXj0wNpv0eYPQCGBPlbp/bqhRk82ErhF/VgSdr4RWZ3tRNBOZC/PxtT9pxsDUHN70L78DJHDXO1qRr0vK01QiIiLaAv72peTwDaZ81Kx9yIcLU3M40mbf+GQVMBXk4Z7bXZiZD+FjP+54USin17+I/3W0Ezfd9Tv0jPrx+Zv245G/fDVuOMhQakq9lvjITcewT+GVpJ57LIAd5UUw5GX/DHmyOa0mTAaX4A0sKr2UhMwthXFuYhZNNo6aqdU1u8txxyt3YjEUxZdvbYKjrFDpJREREeWkhMfNiBBeAvweoDS1nURHT3hQkKfFjc6alN4nmQ7UmvD3bzmIT97fha892o9PHm7A7FIY33ryPL799AVEo8D/fOVOfOTa3cwcorRqqDbCkKdBx9AMbm6xKr2clHJ7g2iyMqx4O1bye7o8ftSYChRezfb1jgYQlWBotcp9+oYG3HaVA/XlRUovhYiIKGexSJRil2aX0DMayO7gxZlhADKl42bzy2H8qmsMNzbVoFifWd+2Rw7ZcfKiD3f/9jwWQ1E8dGoEU7PLeFNzLT51eB/spXy3lNJPp9XAaTXj1HB25M2sZXYpjKHpeRxReY6ZWu2vKYFWI9Dt8ePwgWqll7NtK7lKTSwSqZpGI1ggIiIiUhjHzVLsJ88O473ffQa+uWWll5I6voHYMYXjZsd6vJhdCuPIocx8offFNx/AQWsJvvO7AewoL8KDH74Gd93WygIRKarFYcbp0QCWwhGll5IyZ8aDAICGGoZWb4chT4u9VUZ0Znh4dafHjxqTgVupExEREW0gs1oyMlBbXSx8uGPYh9c0VCm8mhTxDcaOKRw3u+/EMBylhXjpjvV3CVMrQ54W33//S+H2BnD1zjJmDpEqtNrNuDcSxenRAFqzNCjdPRYvElUbFV5J5mq2mXCs15vRO+F1x0OriYiIiGh97CRKMafNBK1GoP1iZr8Lu67pAUBXABSnpgg2dGkef7wwjSNttox9gQIApUX5uGZXeUb/M1B2aXHE8mayeeTM7Q2gWK+DzZK5eTpKa7KZMDMfgseXmTvh+edDGLw0DydDq4mIiIg2xCJRihXm69BYY8TJi1m8g9DKzmYpKn7c3+6BEMBbmSlClFQ1pgJUleizu0g0FkRDtZHF2QQ0x4srmTpy1j3iBwB2EhERERFtAotEaeByWNDpmUE4ElV6KanhG0hZHlE0KvHASQ9esbsctWZ2AhAlW6vdgo6hzHzxvxEpJfq8ATTUcNQsEXurjMjXatDt8Su9lG1ZKW45rewkIiIiItoIi0Rp4HJYML8cQX88QDWrSBnrJEpRHtF/XbiEkZkFvI1dREQp0eIwY2h6Hpdml5ReStKN+hcRXAyjoZqh1YnI12nQWJO54dVdnhnUlRXCVJin9FKIiIiIVI9FojRwxQNh27Px3frZCSA0D1hSUyQ6emIYRoMuo7deJlKzVnv25hK5xwIAGFqdDE6bGT0jAUSjUumlbFm3x888IiIiIqJNYpEoDeylBSgv1qMjG3OJfAOxYwrGzfwLIfxnjxdvbq6FIU+b9OsTUSyUWKsR2Vkk8sa6N/eySJSwJpsJs0thDFyaU3opWzIZXMKofxHNzCMiIiIi2hQWidJACAGXw4z2oWwsEg3GjikYN/tV1yiWwlH8ySF70q9NRDGF+TrsrTJmbZHIZilAiYFjRolaCa/uyrCRs+6R2HqbrCwSEREREW0Gi0Rp4qqzYPDSPKayLfdjegCAAMyOpF/66AkP9lYVc0caohRrdZhxamgmI0eJ1uMeCzCPKEl2VRShIE+LrgwLr+4c9kMI4CCLRERERESbwiJRmqzkEmXdLkK+AaDECuj0Sb3suYkgTg3P4EibnVtXE6VYi92M4FIYF6ZmlV5K0iyGIrgwNYdG7myWFDqtBgdqSzJuh7Muzwx2VxSjSK9TeilEREREGYFFojRx2kzQaUT2jZylaGezoyc80GoE3tJqTfq1iehKK+HV2VTEPjcxi0hUspMoiZw2M3pG/QhHokovZVOklOgeYWg1ERER0VawSJQmhjwtDtSWoD3bwqunBwBLXVIvGYpE8UD7CK7bV4kKY3I7lIjoxXZVFMOo16Eji3KJVkKrG9hJlDROmwmLoSjOTWZGx9mofxFTs8totnPUjIiIiGizWCRKo1aHBV2ezHkXdkPLc8DcBGBJbifRk/2TmJpdwpFDtqRel4hWp9EINNtjuUTZwj0WgF6nQX1ZkdJLyRpN8Xy4ruHMGDnr9jC0moiIiGirWCRKI1edBQuhyOV3uDPeys5mlvqkXvboyWGUF+fjNQ2VSb0uEa2t1WGG2xvA/HJY6aUkhdsbxN4qI7QaZpoly46yIhj1OnSNZEYxsdPjh04j0FjDkUMiIiKizWKRKI1cjlguwslsGTlbKRIlMZPo0uwSHu+bwFtarMjT8tuTKF1a7GZEJTIumHgtbm8ADdUcNUsmjUbgoNWUMd8jXZ4Z7Ks2wpCnVXopRERERBmDr8LTyGouQKVRnz3h1dMDsWMSx81+fmoU4ajEkUP2pF2TiDbWEg+vPpUFuUSTwSVMzS6jgR0kSee0m9A3FsRyWN1j01JKdHkYWk1ERES0VSwSpZEQAi6HJXuKRL4BQG8CCixJuZyUEkdPDMNpM2EfOwCI0qqsWA9HaWFW7HDWHx/pbeTPkaRzWs1YjkQv/ztWq8FL8wguhtFsYx4RERER0VawSJRmbXUWDE8vYDK4pPRSEucbBErrAZGczI/e0QDc3iCOtDGwmkgJLXZzVnQSub0BAGCxOQWcK+HVKs8l6loJrWaRiIiIiGhLWCRKM1ddrPU9K7qJpgeSGlp934lh5Os0eHOzNWnXJKLNa3WY4Q0sYsy/oPRSEtI3FkSlUY+yYr3SS8k6NksBLIV5qt/hrMvjh16nwd4qFgqJiIiItoJFojQ7UGtCnlZkfpEoGgFmhpKWR7QYiuChU6M4fKAapsK8pFyTiLbmci5Rho+cub0B5hGliBACTTYzukbUXiSawYHaEm6AQERERLRFfPaUZoY8LQ7UmtCe6TucBUaAaChpnUSP9Y3DvxDiqBmRgvbXliBfq8nokbNwJIqz47PMI0ohp9WEM+NBLCxHlF7KqiJRiZ6RAEOriYiIiLaBRSIFuBwWdHn8qt8dZl0rO5uVJqeT6OgJD2pMBrx8d3lSrkdEW6fXabG/tiSjw6sHpuawHImioYYFIJkLAAAgAElEQVRFolRx2kyIRCVOjwWUXsqqzk3MYiEUuZyfRERERESbxyKRAlx1ZiyFo+hT6RPsTfENxo5JGDfz+hfx9NlJvNVlg1aTnBBsItqeFrsZ3SN+hCOZWcTui++6ta+K42apstKh0+1RZzGxM74uFomIiIiIti6hIpEQolQI8agQ4mz8uOpe6EKIQSFEtxDilBDiRCL3zAZtdbF/TRmdS+QbADQ6oCTxkOkH2j2ISuBtHDUjUlyrw4yFUAT94+re4nwt/d4AdBqBXZVFSi8la1WbDKg06tHlUWcuUbfHj2K9DjvLi5VeChEREVHGSbST6DMAHpdS7gHwePzjtVwnpWyRUh5K8J4Zr8ZUgBqTAe0ZPNIB3yBgdgBaXUKXkVLi6IlhXFVfivpyvqgjUlqrPVbEztSRM/dYELsqiqHXaZVeSlZz2kyqDa/u8szgoLUEGnamEhEREW1ZokWimwH8R/zv/wHgLQleL2e4HJbMDq+eHkhKaPWJiz4MXprHkUPsIiJSA3tpAUqL8jM2vNrtDTKPKA2arGacn5zF7FJY6aVcYTkcRd9YkKHVRERERNuUaJGoSko5BgDxY+Ua50kAjwghTgoh7kjwnlmh1WHGyMwCxgOLSi9le3wDSckjOnpiGIX5WtzYVJOERRFRooQQaLWb0ZGB47D+hRBGZhbQUM08olRz2k2QEuhRWTdRvzeI5UiUeURERERE27RhkUgI8ZgQomeVPzdv4T4vl1K6ALwBwEeEEK9a5353CCFOCCFOTE5ObuEWmcW1kkuUid1ECz5g0Z/wzmbzy2H8umsMb2yqQZE+sbE1IkqeFrsZ5yfn4F8IKb2ULemPh1azkyj1mqyxIky3ynKJLodWW9lJRERERLQdGxaJpJTXSykPrvLnIQDjQogaAIgfJ9a4xmj8OAHgQQBXrXO/e6WUh6SUhyoqKrbzz5QRDtSWIF+ryczw6umB2DHBcbOHu72YW47gyCF74msioqRpccReYHepdPeqtbi9sR0jG9lJlHLlxXpYzQWXizJq0e3xw1KYB3tpgdJLISIiIspIiY6b/QLAe+N/fy+Ah154ghCiSAhhXPk7gNcD6EnwvhlPr9OiyWbKzPBq32DsmOC42dETw6gvK8RL6lfdFI+IFNJsN0OIzAuv7hsLwlyYh6oSvdJLyQlOmwndKhs36/TMoMlmhhAMrSYiIiLajkSLRP8HwOuEEGcBvC7+MYQQtUKIh+PnVAH4nRCiE8AzAH4tpTyW4H2zgsthRveIH8vhqNJL2RrfSidR3bYvcfHSHP57YBpva7PxyTyRypQY8rCrojjjwqv7vQHsqzLyZ0qaNNlMuHhpHv55dYwlLixHcHZiFk4r84iIiIiItiuhIpGU8pKU8rVSyj3x43T88VEp5Y3xv1+QUjbH/xyQUn4pGQvPBi6HBcvhKHpH1fVO7IZ8g0BRBaDffu7H/Sc9EAJ4axt3NSNSoxa7GaeGZyClVHopmxKNSvR7g2is4ahZujTHdxDrGlFHMfH0mB+RqGRoNREREVECEu0kogSshFefzLTw6unEdjaLRCUeOOnBK/dUoMbE3AgiNWp1mDE9t4yh6Xmll7IpHt8C5pYjaKhmaHW6HKyNFWO6VBJe3TkcW0eznaHVRERERNvFIpGCqkoMsJoLMi73A77BhEKr/3B+CqP+RRxhFxGRarXEX2hnyshZXzy0uoGdRGljKsxDfVmhanY46x7xo9KoR1WJQemlEBEREWUsFokU1uowZ9YOZ+FlwO8BSrffSXT0hAclBh1et78qiQsjomTaV2VEQZ42Y4rY7rEghAD2VhUrvZSc4rSZVbMLXqdnBk4bu4iIiIiIEsEikcLa6iwY8y9izL+g9FI2Z2YIgNx2J5F/IYTjvV7c3GKFIU+b1KURUfLotBo02UzoyJBOIrc3gPqyIhTm65ReSk5x2kwY9S9iMrik6DqCiyFcmJxjHhERERFRglgkUpjLEcslar+YGS/E4BuMHbeZSfTLzlEshaM4coijZkRq12o3o280gKVwROmlbMjtDTKPSAFN8Z3EuhUOr+4eiY28sUhERERElBgWiRTWWFMCvU6TOSNnvoHYcZudREdPDKOh2nj5hQURqVerw4zlSBS9owGll7Ku+eUwBi/NoaGaeUTpdtBqghDKh1ev3J/jZkRERESJYZFIYfk6DZw2U+bscDY9AOgKAGP1lr/0zHgQnR4/3tZmgxAiBYsjomRqscc6HU+pPJfo7PgspAT2sZMo7Yr0OuyuKFY8vLrb44fNUoDSonxF10FERESU6VgkUgGXw4LeUT8WQ+of6bi8s9k2ijxHTwxDpxG4pdWa9GURUfJVmwyoMRlUv8OZO76zWWMNi0RKcNrM6PT4IaVUbA2dnhk0s4uIiIiIKGEsEqlAq8OCUESid1Qd2wivyzewrVGzUCSKBztG8JqGSpQV65O/LiJKiRa7GR3D6u507BsLojBfC7ulUOml5CSnzYSp2SV4A4uK3P/S7BI8vgU0MY+IiIiIKGEsEqmAqy727qfqw6uljHUSlW49tPqJ/klMzS7jyCF78tdFRCnTYjdjeHoBU7PK7l61Hrc3gH3VRmg0HGNVwkpxRqlcIoZWExERESUPi0QqUGk0wF5aoP7w6tkJIDS/rU6ioyeGUV6cj2v3VSR/XUSUMq0OdecSSSnjO5sxtFop+2tKoNMIdHmU+R5ZKU5xQwQiIiKixLFIpBIuhwXtQz5FMx025BuMHS1b6yTyz4fwG/cE3tJiRZ6W33JEmaTJaoJWI1SbSzQeWMLMfIh5RAoy5Gmxt8qoWCdRl8ePnRVFMBryFLk/ERERUTbhK3aVcDksGA8sYWRmQemlrM03EDtucdzssb5xhKMSNzXXpmBRRJRKBfla7KsyqrZI1BcPrWYnkbKa7SZ0jygTXt3F0GoiIiKipGGRSCVc8ZGOdpWOdAAApgcACMDs2NKXHe/1orrEACdHAYgyUqvDjM7hGUSj6ut0dI8FAQD7qtlJpKQmqxkz8yEMT6f3jQ6vfxETwSWOmhERERElCYtEKtFQY0RBnhbtF1WcS+QbBEqsgG7zu5PNL4fx5JlJHD5QxVBZogzVYjcjuBTG+clZpZfyIv3eAGpNBpgKOGqkpJXQ6K6R9L7RsZKD1GxnkYiIiIgoGVgkUok8rQZOmwkdag6v9g1sObT6yf5JLIWjOHywOjVrIqKUWwmv7lDhyJnbG0RDDUfNlLa3yoh8nSbtuURdHj+0GoH9NSwSERERESUDi0Qq4qqzoHc0gMVQROmlrM43CJTWb+lLjvd6YSnMw1X1pSlZEhGl3s7yIhgNOnSobBx2ORzFuYlZNHDUTHH5Og0aa0rSvsNZ14gfeyqLUZCvTet9iYiIiLIVi0Qq4nJYEI5KdI8os0PMupbngNnxLe1sthyO4vG+CVzfWAUddzUjylgajUCL3ay68Orzk7MIRyU7iVTCaTWhZySQtuwqKSVDq4mIiIiSjK/cVaTVEXuie1KNuUS+wdhxC+Nmfzg/heBSGDdw1Iwo47Xazej3BjC3FFZ6KZe54zubNbKTSBWcNhNml8K4MDWXlvsNTy9gZj4EJ/OIiIiIiJKGRSIVKS/Wo66sUJ3h1StFotLNdxId7x1HUb4WL99dnpo1EVHatDjMiEqoqtPRPRZEvlaDHeVFSi+FADjjHT3daQqvXgnJdlrZSURERESULCwSqUybw4L2oRlIqbKtpqcHYsdNjptFohKPnvbi2oZKGPKYFUGU6VZGetQ0ctbnDWJPVTHHWVVid2UxCvK06BxOTyGxy+NHvlaDfewkIyIiIkoaPrNWmdY6C6Zml+DxLSi9lCv5BgG9CSiwbOr0kxd9mJpdxg0HOGpGlA3K4p2OatqB0T0WQEM184jUQqsROGgtSVu3WZdnBo01sV3ViIiIiCg5+MxKZVzxXKJ2Fb0QAwD4BgBLHSDEpk4/3utFvlaD6xoqU7wwIkoXNYVXT88tYyK4hMYadpGoSZPVjN5RP8KRaErvE41K9IwELo+4EREREVFysEikMvuqjCjM16ovl8g3uOk8IikljvV48Yo95SjW61K7LiJKm1a7GeOBJYz5le90XAmt5qiRujTbTVgMRXF2Yjal97kwNYvZpTCcNoZWExERESUTi0Qqo9Nq0Gwz46SaOomiEcB3cdN5RL2jAYzMLHDUjCjLtDhi46YdQ8p3E7nHggDAcTOVabLGijbdntSOnHXFr89OIiIiIqLkYpFIhVx1ZvSNBTG/rJKtpgMjQDQEWOo3dfrxXi80Arh+f1Vq10VEadVYY0S+VqOKkTO3N4Dy4nxUGPVKL4Wep76sCEa97vLOY6nS5fGjIE+L3ZXFKb0PERERUa5hkUiF2uosiETl5XdKFecbjB03OW52rMeLq3aUorQoP3VrIqK00+u0OGAtUUV4tdsbZBeRCmk0Ak02U8p/f3V5ZnDQWgKtZnM5eURERES0OQkViYQQR4QQvUKIqBDi0Drn3SCE6BdCnBNCfCaRe+aCVntspEM14dXTA7HjJjqJzk/O4uzELEfNiLJUi92M7hE/QikOJl5PJCrR7w2igXlEqtRkM6FvLIClcCQl1w9FougdZWg1ERERUSok2knUA+BWAE+tdYIQQgvgbgBvALAfwG1CiP0J3jerWYrysbO8CO0XlR/pABDrJNLogBLbhqce7/UCAF7PIhFRVmp1WLAYiqLfG1RsDYOX5rAUjqKhhp1EatRsMyMUkSn7HjkzHsRSOMrQaiIiIqIUSKhIJKXsk1L2b3DaVQDOSSkvSCmXAfwEwM2J3DcXtDos6BjyQUqp9FIA3wBgdgDajXcqO97jRbPNhFpzQRoWRkTp1mqPdW90KJhL9FxoNTuJ1GglvDpVI2fdDK0mIiIiSpl0ZBJZAQw/72NP/LFVCSHuEEKcEEKcmJycTPni1MpVZ8aluWVcvDSv9FJi42abGDUbnVlAp8ePwwfZRUSUrWyWApQV5eOUgjuc9XsD0GoEQ4tVymYpgKUwL2U7nHV6/DAadKgvK0zJ9YmIiIhy2YZFIiHEY0KInlX+bLYbaLVUyTXbY6SU90opD0kpD1VUVGzyFtnH5VBRLpFvELBsHFr9SHzUjHlERNlLCIFWhxmnhpX72dTnDWJHeREMeVrF1kBrE0LAaTOj05OaQmKXZwZOmwlCMLSaiIiIKNk2LBJJKa+XUh5c5c9Dm7yHB4D9eR/bAIxuZ7G5ZG+VEcV6nfJFogUfsDizqU6iY71e7Kksxs4KvrtPlM1a7Gacn5yDfz6kyP3d3gBHzVTOaTPh7MQsFpaTG169GIqg3xvkqBkRERFRiqRj3OxZAHuEEDuEEPkA3gHgF2m4b0bTagRa7Gblw6t9g7Fj6fqdRJdml/DMwDRu4KgZUdZrie/AmKpOkfUEF0MYnl5AI0OrVa3JakIkKnF6LJDU6/aNBRCOSjQztJqIiIgoJRIqEgkhbhFCeABcDeDXQojj8cdrhRAPA4CUMgzgowCOA+gDcJ+UsjexZecGl8MMtzeAuaWwcouYHogdNxg3e7xvAlEJHOaoGVHWc9pNEALoUCCX6Mw4Q6szQXM84LwryYXE7pFYzlETO4mIiIiIUmLj7arWIaV8EMCDqzw+CuDG5338MICHE7lXLmqtsyAqY+/WX7OrXJlF+FaKRHXrnnas1wuruQAHavnuPlG2KzHkYXdFsSK5RH0rO5uxk0jVqkoMqDTqkx5e3TnsR3lxPmpNhqRel4iIiIhi0jFuRtvkio90tF9UMJfINwgUVQD6td+1Dy6G8LuzU7jhYDWDRIlyRCy8egZSrrkPQUq4vQEYDToWCTJAKsKrY6HVZv6uISIiIkoRFolUzFSYh10VRWhXcKtpTA9sGFr9RP8kliNR5hER5ZAWuwW++RAuXppP633dY0E0VpewSJABnDYTLkzNIbiYnIDzuaUwzk3OosnKPCIiIiKiVGGRSOXa6izoGPKl/d36y3wXN8wjOtbrRXlxPlwOS5oWRURKa4lnzpwaTl8RW0qJfm8QDTXMI8oETTYTpAR6R5MTXt0z4oeUQLOdRSIiIiKiVGGRSOVcjti79QNTc+m/eXgZCHjW7SRaDEXwhHsCr9tfDa2G7+wT5Yq9VcUozNemtUg0MrOA4FIY+xhanRGc8Y6fZIVXXw6ttjK0moiIiChVWCRSOVddPJdIiZEz/zAgo0Dp2p1Evz83hbnlCEfNiHKMTqtBk9WEjqH0Zaa5V0KrqxlanQnKivWwmgvQlaTw6k6PH7UmAyqM+qRcj4iIiIhejEUildtdUQyjQYf2NL4Qu2x6ZWeztYtEx3q8MBp0uHpnWZoWRURq0eIw4/RYAIuhSFru5/bGxpbYSZQ5nDbT5Q6gRK2EVhMRERFR6rBIpHIajUCL3azMDme+lSJR/aqfDkeieKxvHK9tqES+jt9KRLmm1W5BKCKTljmzkT5vEI7SQhTrdWm5HyXOaTPj4qV5zMwvJ3QdfzwkvcnGPCIiIiKiVOIr+wzgcljQPx5M2g4xm+YbBHQGwLj6KNkzg9PwzYc4akaUo1od6Q2vdo8F0MAuoozijBd1Eu0m6hqJfY81s5OIiIiIKKVYJMoAbXUWSAl0DienZX/TpgdiXURrbDV9vMcLvU6DV+2tSO+6iEgVqkoMqDUZ0lIkWgxFMDA1h4Ya5hFlkoOXw6sTLBJ5VkKr2UlERERElEosEmWAFocZQiD9uUS+wTXziKJRieO943j13goU5nP0gyhXtTjMaQmvPjs+i6gEGtlJlFFMBXnYUV6U8A5nXZ4Z1JcVwlSYl6SVEREREdFqWCTKACWGPOypLE5vkUjKWJFojZ3Nukb88AYWOWpGlONa7GZ4fAuYml1K6X1WQqvZSZR5mqwmdCehk4ih1URERESpxyJRhnA5LOgYmkE0KtNzw9kJIDS3Zmj1sR4vdBqB1zZUpWc9RKRKrQ4LAODUUGpHztzeIAx5GjhKC1N6H0o+p82EUf8iJoPbKyROBBcx5l+8nG9ERERERKnDIlGGcDks8C+EcGFqNj039A3GjquMm0kpcbzXi6t3lbH1nyjHHaw1QasR6BhObaej2xvAviojtJrVM9JIvVY6gLpHtldIXOlCYicRERERUeqxSJQhXHWxJ8ftF9OzixB8A7HjKp1EZydmMTA1h8MHOGpGlOsK8rVorDGmNLxaSom+sSAaqjlqlokO1JZAI7YfXt3l8UMjYtchIiIiotRikShD7CwvhqkgL325RL5BAAKw1L3oU8d6vBACeP1+jpoRUSyXqHPYj0iKxmEnZ5cwPbeMhhqGVmeiIr0OuyuLEygSzWB3ZTGK9NwkgYiIiCjVWCTKEBqNQKvDnL4i0fQAUGIFdPoXfepYjxcuhwWVJYb0rIWIVK3FbsHsUhjnJ1MzDuseCwIAO4kyWJPVjC6PH1JurZAopWRoNREREVEasUiUQVwOC85OzCKwGEr9zXyDq46aDU/P4/RYADdw1IyI4lodsRfwqQqvvryzWTU7iTJVs92EqdkljPkXt/R1o/5FXJpbZmg1ERERUZqwSJRBXA4LpEz9LkIAYplEpfUvevh4rxcAmEdERJftKCtCiUGXsvBq91gQ1SUGWIryU3J9Sr0ma6zIs9WRs6541hU7iYiIiIjSg0WiDNJsN0EI4OTFFI+cLc8Bs+OrdhId6/GisaYEjjJuQ01EMRqNQLPdjI6UdRIFmUeU4RprSqDTiC3vcNbp8SNPK9DI//5EREREacEiUQYxGvKwr8qY+lwi38XY0bLjiocngos4OeTjqBkRvUirw4Iz40HMLYWTet1QJIpzE7PMI8pwhjwt9lUbt9xJ1D0yg33VRuh12hStjIiIiIiej0WiDOOqs+DU8AyiKdpFCEBs1Ax4UZHo0dPjkBI4fJC7mhHRlVrtZkTl9rc5X8vA1ByWI1HmEWUBp820pfDqaJSh1URERETpxiJRhnE5LAguhnEuRbsIAYiFVgNA6ZVFomM9XtSXFWJfFV+sEdGVWuzx8Orh5I6c9Y3FQ6s5bpTxnDYz/AshDE8vbOr8i9PzCC6G4bQytJqIiIgoXVgkyjCu+C5C7anMJZoeAPQmoMBy+SH/Qgj/df4SDh+shhAidfcmooxkKcpHfVkhOpI8Duv2BpGnFdhZXpzU61L6rYRXd3o2V0js8jC0moiIiCjdWCTKMDvKi2ApzEttLpFvALDUAc8rBv3GPY5wVHJXMyJaU4vdjFPDM5seJ9oM91gAuyqKka/jr6tMt6/aiHydBt0jmxtJ7Bz2Q6/TYG8VC4RERERE6cJn3RlGCIFWhyW1O5z5BlcdNasq0aOF7+gS0RpaHRZMBJcw5l9M2jXd3iAaaxhanQ3ytBrsrylB5yZHErtHZnCgtgQ6LZ+qEBEREaULn3lloLY6C85PzmFmfjn5F49GYrubWeovP7SwHMGTZyZx+EA1NBqOmhHR6lZyiTqGkpNL5J8PYcy/yNDqLOK0mdAz4t9w84VwJIqekQBHzYiIiIjSLKEikRDiiBCiVwgRFUIcWue8QSFEtxDilBDiRCL3JKA1nkvUkeSAWABAYBSIhq7Y2ezJM5NYDEU5akZE62qsKUG+ToNTw8npdHR7V0Kr2UmULZqsJswtR3Bham7d885PzmEhFIHTxtBqIiIionRKtJOoB8CtAJ7axLnXSSlbpJRrFpNoc5ptZmgE0JGKkTPfQOz4vHGz471emAvzcNWO0uTfj4iyRr5Og4O1JUnb4cztDQIAGtlJlDWa491mXRuEV3cytJqIiIhIEQkViaSUfVLK/mQthjanSK9DQ3UJ2pM00nEF32DsGB83Ww5H8XjfOK5vrEIecyGIaAMtdgu6PH6EItGEr+X2BmApzEOFUZ+ElZEa7KooRmG+Fl2e9cOruzwzKNbrsLO8KE0rIyIiIiIgfZlEEsAjQoiTQog70nTPrOaqM6NjyIfIBrkOWzY9AGh0QIkNAPDHC5cQWAzjBo6aEdEmtDrMWApH0R/vAkpE31gQDdUlEIJZaNlCqxE4WGvacIezbo8fB60lzMEjIiIiSrMNi0RCiMeEED2r/Ll5C/d5uZTSBeANAD4ihHjVOve7QwhxQghxYnJycgu3yC0uhwVzyxGcGU/8hdgVfAOAyQ5odQCAY71eFOZr8Yo95cm9DxFlpefCqxMbh41GJfq9QTTUcNQs2zTZTOgd9SO8RrfZcjiKvrEgmjlqRkRERJR2GxaJpJTXSykPrvLnoc3eREo5Gj9OAHgQwFXrnHuvlPKQlPJQRUXFZm+Rc9rqLACA9gRfiL2Ib/ByHlEkKvFI7ziu21cJQ542ufchoqxksxSgvDg/4WD9oel5LIQiaKxmaHW2cdpMWAxFcXZidtXP93uDWI5EmUdEREREpICUj5sJIYqEEMaVvwN4PWKB15QAR2khyory0X4xyblE0wOXdzbrGPJhanYJhw9y1IyINkcIgRa7JeHw6ud2NmMnUbZZKf6sFV79XGg1dzYjIiIiSreEikRCiFuEEB4AVwP4tRDiePzxWiHEw/HTqgD8TgjRCeAZAL+WUh5L5L4UeyHW6rAkPNJxhQUfsDhzObT6WI8X+VoNrtvHji4i2rxWhxkXJufgnw9t+xp9Y0FoBLCnkkWibFNXWgijQbdmeHWXZwaWwjzYLAVpXhkRERER6RL5Yinlg4iNj73w8VEAN8b/fgFAcyL3odW56sx4rG8c03PLKC3KT/yCKzuble6AlBLHT3vx8t1lMBryEr82EeWM1ngu0SnPDF69d3tF5n5vEPXlRSjI56hrttFoBJqsa4dXd3n8aLKZGVhOREREpADuaZ7BXI5YLlHSuommB2JHSz1OjwUwPL2AGzhqRkRb1GQzQYjEfja5vQHmEWUxp82MvrEAlsKRKx5fWI7g7MQsmjlqRkRERKQIFokymNNmglYjkhdevdJJZKnH8R4vNAK4vrEqOdcmopxhNORhT2XxtnOJ5pbCuDg9j33VHDXLVk6bCaFIbAe75zs95kckKhlaTURERKQQFokyWGG+DvtrSpIXXu0bAArLAb0Rx3vH8ZL6UpQV65NzbSLKKa3x8Gop5Za/9sx4EFICDSwSZa2VUOoX5hJ1Dvuv+DwRERERpReLRBnO5TCj0zODcCSa+MV8g0DpDlyYnEX/eJCjZkS0bS0OM2bmQxi8NL/lr3XHu0saazhulq2s5gKUFuW/aIezLs8Mqkr0qCoxKLQyIiIiotzGIlGGc9VZML8cQf94cOOTNzI9CFh24HjvOADg9QdYJCKi7WlZCa8e3vo4rHssgGK9DlYzd7fKVkLEwqtf2EnUNeJHk5WjZkRERERKYZEow62EV7cPJThyFl4GAp5YHlGvF06biS/QiGjb9lYZUZivxalt/Gzq8waxr9oIjYa7W2WzZpsJZydmsbAcC68OLIZwYXKOodVERERECmKRKMPZLAUoL9aj/WKC4dX+YUBGMWOw4tTwDA6zi4iIEqDVCDhtJnRsMbxaSgn3WIB5RDmgyWZGJCpxeizWTdQT7ypy2tlJRERERKQUFokynBACLoc58R3OpgcAAP/li2WAsEhERIlqdVhwejSAxVBk45PjvIFFBBbDaGAeUdZ7YXh110js2GRlJxERERGRUlgkygJtdRZcvDSPqdml7V/EFysS/XJYj92VxdhdWZyk1RFRrmqxmxGOSvSO+jc+Oc49Fg+tZidR1qsqMaCqRP9ckcgzA3tpLNCaiIiIiJTBIlEWcNXFcok6Eskl8g1C6gw4PgTcwC4iIkqC1vjY0FZ+NvV5AwCAvSwS5YQmq/nyDmddHj+cDK0mIiIiUhSLRFmgyWqCTiMSGznzDSJgsCIS5agZESVHZYkBVnMBTm0hl8g9FoTVXIASQ14KV0Zq0Wwz4cLUHIYuzcPjW7g8gkZEREREymCRKAsY8rQ4UFuSWHj19AAGopWwmgtw0MosECJKjha7eUudRG5vAHXmreEAABCxSURBVI017CLKFU02E6QEfvTMEADAaWMnEREREZGSWCTKEq0OCzo9MwhFolv/YikhfYM4NWvG4QPVEILbThNRcrTYzRiZWcBkcOPMtKVwBOcn59BQzUJ1rlgpCt13YhhCgG9SEBERESmMRaIs4aqzYDEUvRz6uiVzkxChOQxEKnH4QFXyF0dEOavVESsCbGbk7NzELCJRiQZ2EuWM0qJ82CwFmJ5bxs7yIhg5ZkhERESkKBaJskRbPLx6W7lE07GdzXx6Kw7VlyZzWUSU4w7GM9M6NvGzqd8bK3Kzkyi3rOQQNXPUjIiIiEhxLBJliVpTbCvh7RSJlqcuAADqd++HVsNRMyJKHkOeFo01JZvqJHJ7g9DrNKgvK0zDykgtVkbOmhhaTURERKQ4FomyhBACLodlW0Uiz4VeRKVAW0tLClZGRLmuxW5G5/AMIlG57nl9YwHsrTJCp+Wvplxyza4y6DQCV+8qU3opRERERDmPz8SziMthwfD0AiaCi1v6Op/nDCZQipftrU3Ryogol7XYzZhbjuDcxOy657m9QTRUM48o1zhtZnR/8TDHDImIiIhUgEWiLOKqi7Xst1/c/HbT4UgUmpmLCBbaoNdpU7U0Isphz4VXr93pODW7hMngEvaxSJSTCvL5+4eIiIhIDVgkyiIHak3I12o2FRC74tlBH6zSC0PlrhSujIhy2Y7yIpgK8tAxtHYBeyW0urGG3SREREREREphkSiLGPK0OGAt2VIu0W+6B1EpZlBV15DClRFRLhNCoMVuXje8um8sAAAcNyMiIiIiUhCLRFnG5bCgy+PHcji64blSSpzu7QQA5Fewk4iIUqfFbsaZ8SBml8Krft7tDaLCqEdZsT7NKyMiIiIiohUsEmUZl8OCpXD08rvy6+ny+FEw54l9YNmR4pURUS5rcZgRlUCXZ/Vuon6GVhMRERERKY5FoixzObx6EyNnx3u9qNdMxD4oZZGIiFKnxbYSXv3iIlE4EsWZ8SDziIiIiIiIFMYiUZapMRWgxmTAyYvrF4mklDjW48VVJj+gLwEKLGlaIRHlIktRPnaUF60aXj14aR5L4Sg7iYiIiIiIFMYiURZy1VnW3UUIAM5NzOLC1BwOFEwDlnpAiPQsjohy1kp4tZTyisfd3pXQanYSEREREREpiUWiLORyWDAys4DxwOKa5xzv9QIAqiJjHDUjorRodZgxGVzCqP/Kn03usSC0GoFdlUUKrYyIiIiIiIAEi0RCiK8IIdxCiC4hxINCCPMa590ghOgXQpwTQnwmkXvSxlyOeC7ROiNnx3q9OGQ3QhcYjnUSERGlWIs99rOp4wWZaW5vALsqiqDXaZVYFhERERERxSXaSfQogINSSieAMwA++8IThBBaAHcDeAOA/QBuE0LsT/C+tI4DtSbk6zRrhlcPT8+jZySAW3ZrgMgydzYjorRoqC6BXqfBqReMw/aNBTlqRkRERESkAgkViaSUj0gpw/EP/wjAtsppVwE4J6W8IKVcBvATADcncl9aX75OgyarCe1r5BI9cnocAPDaqvnYA+wkIqI0yNdpcNBqumKHs8BiCCMzC2ioYWg1EREREZHSkplJ9H4A/7nK41YAw8/72BN/jFLI5TCj2+PHUjjyos8d7/GiodqI6mgsl4iZRESULi12M7pH/AhFogCAM94gAKCRnURERERERIrbsEgkhHhMCNGzyp+bn3fOXwMIA/jhapdY5TG5ymMr17pDCHFCCHFicnJyM/8MtIq2OguWI1H0jgaueHwyuIRnL07j8IFqYHoA0OiAktUawIiIkq/VYcZSOAr3WKw41BcvErGTiIiIiIhIebqNTpBSXr/e54UQ7wVwE4DXyhfuaxzjAWB/3sc2AKPr3O9eAPcCwKFDh9YsJtH6XA4LgFh49crfAeCxvnFICdxwsBr43SBgsgPaDb8NiIiS4nJ49bAPTTYT3GMBmAryUF1iUHhlRERERESU6O5mNwD4NIA3Synn1zjtWQB7hBA7hBD5AN4B4BeJ3Jc2VlligNVcgI4X5BId6/GirqwQDdVGwDfAUTMiSiuruQDlxfrL4dVubxAN1UYIsVrTKRERERERpVOimUT/AsAI4FEhxCkhxDcBQAhRK4R4GADiwdYfBXAcQB+A+6SUvQnelzbBVWe5YoezwGIIfzg/hcMHqmMvyHyDDK0morQSQqDVYcap4RlEoxL98SIREREREREpL6E5Iynl7jUeHwVw4/M+fhjAw4nci7bO5TDjl52jGJ1ZQK25AL91TyAUkbE8ooUZYMEHWNhJRETp1WI349HT4+gdDWB2KYyGGoZWExERERGpQTJ3NyOVuZxLFO8mOtbjRaVRj1a7OTZqBrCTiIjSrtURyyX6ybNDAMBOIiIiIiIilWCRKIvtry2BIU+D9oszWAxF8ET/JF5/oAoaTXzUDGAmERGlndNmhhDAQ6dGIQSwt4pFIiIiIiIiNWCRKIvlaTVwWs1oH/LhqTOTWAhFcMOBmtgnp9lJRETKKNbrsLfSiNmlMOpKC1Gk5w6LRERERERqwCJRlmutM6N31I+HOkdhKsjDS3eWxj7hGwQKywE938EnovRbGTlrqGYeERERERGRWrBIlOVcDgtCEYmHu8dwfWMV8rTx/+S+AY6aEZFiWuzxIlENC9VERERERGrBIlGWWwmvlhI4fKDquU9MD3LUjIgU87KdZdBpBF5SX6r0UoiIiIiIKI5BEFmuwqiHvbQAU8FlvGpvRezB8DIQ8ACWdyi7OCLKWfXlRWj//OtQYshTeilERERERBTHIlEOuOOVOzG7FIEhTxt7wD8MyCjHzYhIUSwQERERERGpC4tEOeDdV9df+YCPO5sRERERERER0ZWYSZSLpleKROwkIiIiIiIiIqIYFolykW8Q0BmA4qoNTyUiIiIiIiKi3MAiUS7yDcZGzTT8z09EREREREREMawS5KLpAY6aEREREREREdEVWCTKNVI+10lERERERERERBTHIlGumZsEQnNAKTuJiIiIiIiIiOg5LBLlGt9g7MhOIiIiIiIiIiJ6HhaJcs30QOzITCIiIiIiIiIieh4WiXKNbwCAAMwOpVdCRERERERERCrCIlGu8Q0CJbVAnkHplRARERERERGRirBIlGumBzhqRkREREREREQvwiJRrvENMrSaiIiIiIiIiF6ERaJcsjwPzHqB0nqlV0JEREREREREKsMiUS7xDcaOHDcjIiIiIiIiohdgkSiXsEhERERERERERGtgkSiX+AZix1IWiYiIiIiIiIjoSiwS5RLfIKAvAQosSq+EiIiIiIiIiFSGRaJcMj0Q29lMCKVXQkREREREREQqo0vki4UQXwHwJgDLAM4DeJ+UcmaV8wYBBAFEAISllIcSuS9tk28QqGxUehVEREREREREpEKJdhI9CuCglNIJ4AyAz65z7nVSyhYWiBQSjQAzF5lHRERERERERESrSqhIJKV8REoZjn/4RwC2xJdEKREYBSLL3NmMiIiIiP7/9u4v1LK6igP4dzXav3GqMf9k6qT9eUrMYvDFEiETk8gM+uPTRA/TQ4G9GRlkQRBR0UNQTCQYWCGYKWShQWES5D/GtHTKnGvZDI42V2pIiHL1cPbAYPdczTvn7IPn84HL3ud3zpy9BhaLw2L/1gaANR3NmUQfT/LTKe91klur6p6q2nkUr8nztboyOW49Y8woAAAAgAX1nDOJqurnSV63xltXdfdNw2euSvLvJNdN+ZrzuntfVZ2U5Laqeqi7b59yvZ1JdibJtm3bnsd/gedlde/kaLsZAAAAsIbnbBJ194XrvV9VO5K8L8m7u7unfMe+4Xigqm5Mcm6SNZtE3b0rya4k2b59+5rfxwuwupK85JjkVXYEAgAAAP9rQ9vNquriJFcmeX93/3PKZzZX1ZbD50kuSvLARq7LC3Bwb/Lq05NNG3qgHQAAAPAitdGZRN9MsiWTLWS7q+rbSVJVr6+qW4bPnJzkjqq6L8mdSX7S3T/b4HX5f63uNY8IAAAAmGpDt5V095unrO9Lcslw/kiSt23kOhwFqyvJWy8bOwoAAABgQR3Np5uxqJ5+Knl6NdlqaDUAAACwNk2iZbC6MjnabgYAAABMoUm0DFb3To7Hu5MIAAAAWJsm0TJwJxEAAADwHDwPfdb+9qfkiT3jxvDor5NXnpC8bMu4cQAAAAALS5No1vbcktz6ubGjSM48f+wIAAAAgAWmSTRrZ38kOeNdY0dhHhEAAACwLk2iWTvupMkfAAAAwAIzuBoAAAAATSIAAAAANIkAAAAAiCYRAAAAANEkAgAAACCaRAAAAABEkwgAAACAaBIBAAAAEE0iAAAAAKJJBAAAAECS6u6xY5iqqp5I8ujYcRwFJyR5cuwgYCAfWSTykUUhF1kk8pFFIRdZJPLx6HpDd5/47MWFbhK9WFTV3d29few4IJGPLBb5yKKQiywS+ciikIssEvk4H7abAQAAAKBJBAAAAIAm0bzsGjsAOIJ8ZJHIRxaFXGSRyEcWhVxkkcjHOTCTCAAAAAB3EgEAAACgSTRzVXVxVe2pqoer6jNjx8Nyq6qVqrq/qnZX1d1jx8PyqKprqupAVT1wxNrxVXVbVf1xOG4dM0aWx5R8vLqq/jrUx91VdcmYMbIcqur0qvpFVT1YVb+rqiuGdfWRuVsnH9VH5qqqXl5Vd1bVfUMufmFYVxvnwHazGaqqTUn+kOQ9SR5LcleSy7v796MGxtKqqpUk27v7ybFjYblU1flJDiX5XnefNax9JcnB7v7y0ETf2t1Xjhkny2FKPl6d5FB3f3XM2FguVXVKklO6+96q2pLkniQfSPKxqI/M2Tr5+OGoj8xRVVWSzd19qKqOTXJHkiuSfDBq48y5k2i2zk3ycHc/0t3/SvLDJJeOHBPA3HX37UkOPmv50iTXDufXZvJDFGZuSj7C3HX3/u6+dzj/R5IHk5wa9ZERrJOPMFc9cWh4eezw11Eb50KTaLZOTfKXI14/FoWWcXWSW6vqnqraOXYwLL2Tu3t/MvlhmuSkkeOBT1XVb4ftaG5hZ66q6owkb0/ym6iPjOxZ+Zioj8xZVW2qqt1JDiS5rbvVxjnRJJqtWmPN/j7GdF53vyPJe5N8cthyAUDyrSRvSnJOkv1JvjZuOCyTqjouyQ1JPt3dfx87HpbbGvmoPjJ33f2f7j4nyWlJzq2qs8aOaVloEs3WY0lOP+L1aUn2jRQLpLv3DccDSW7MZEskjOXxYf7B4TkIB0aOhyXW3Y8PP0ifSfKdqI/MyTBv44Yk13X3j4Zl9ZFRrJWP6iNj6u6nkvwyycVRG+dCk2i27krylqo6s6pemuSjSW4eOSaWVFVtHoYQpqo2J7koyQPr/yuYqZuT7BjOdyS5acRYWHKHf3QOLov6yBwMw1m/m+TB7v76EW+pj8zdtHxUH5m3qjqxql4znL8iyYVJHoraOBeebjZjwyMiv5FkU5JruvtLI4fEkqqqN2Zy91CSHJPk+/KReamqHyS5IMkJSR5P8vkkP05yfZJtSf6c5EPdbZgwMzclHy/IZCtFJ1lJ8onDcw9gVqrqnUl+leT+JM8My5/NZA6M+shcrZOPl0d9ZI6q6uxMBlNvyuTGluu7+4tV9dqojTOnSQQAAACA7WYAAAAAaBIBAAAAEE0iAAAAAKJJBAAAAEA0iQAAAACIJhEAAAAA0SQCAAAAIJpEAAAAACT5Lxz7ApWv90c/AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 1440x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(20,5))\n",
    "sns.lineplot(data=preds, label=\"pred\")\n",
    "sns.lineplot(data=labs, label=\"true\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "papermill": {
     "duration": 0.023746,
     "end_time": "2021-12-26T14:46:23.836554",
     "exception": false,
     "start_time": "2021-12-26T14:46:23.812808",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  },
  "papermill": {
   "duration": 159.672275,
   "end_time": "2021-12-26T14:46:24.067327",
   "environment_variables": {},
   "exception": null,
   "input_path": "__notebook__.ipynb",
   "output_path": "__notebook__.ipynb",
   "parameters": {},
   "start_time": "2021-12-26T14:43:44.395052",
   "version": "2.1.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
